অপরিবর্তনীয় মানে কী?


103

যদি কোনও স্ট্রিং অপরিবর্তনীয় হয় তবে এর অর্থ কি এই .... (আসুন জাভাস্ক্রিপ্ট ধরে নেওয়া যাক)

var str = 'foo';

alert(str.substr(1)); // oo

alert(str); // foo

এর অর্থ কি, কোনও স্ট্রিংয়ে পদ্ধতিগুলি কল করার সময়, এটি পরিবর্তিত স্ট্রিংটি ফিরিয়ে দেবে, তবে এটি প্রাথমিক স্ট্রিং পরিবর্তন করবে না?

যদি স্ট্রিংটি পরিবর্তনীয় হয় তবে এর অর্থ কি ২ য়টিও alert()ফিরে আসবে oo?

উত্তর:


104

এর অর্থ হ'ল একবার আপনি বস্তুটি তাত্ক্ষণিকভাবে চালিত করার পরে আপনি এর বৈশিষ্ট্যগুলি পরিবর্তন করতে পারবেন না। আপনার প্রথম সতর্কতার মধ্যে আপনি foo পরিবর্তন করছেন না। আপনি একটি নতুন স্ট্রিং তৈরি করছেন। এ কারণেই আপনার দ্বিতীয় সতর্কতায় এটি oo এর পরিবর্তে "ফু" প্রদর্শন করবে।

এর অর্থ কি, কোনও স্ট্রিংয়ে পদ্ধতিগুলি কল করার সময়, এটি পরিবর্তিত স্ট্রিংটি ফিরিয়ে দেবে, তবে এটি প্রাথমিক স্ট্রিং পরিবর্তন করবে না?

হ্যাঁ. স্ট্রিংটি তৈরি হয়ে গেলে কিছুই পরিবর্তন করতে পারে না। এখন এর অর্থ এই নয় যে আপনি চলকটিতে একটি নতুন স্ট্রিং অবজেক্ট বরাদ্দ করতে পারবেন না str। আপনি কেবল বর্তমান অবজেক্টটি পরিবর্তন করতে পারবেন না

যদি স্ট্রিংটি পরিবর্তনযোগ্য ছিল, তার মানে কি দ্বিতীয় সতর্কতা () এছাড়াও খুব ভাল ফিরে আসবে?

প্রযুক্তিগতভাবে, না, কারণ সাবস্ট্রিং পদ্ধতিটি একটি নতুন স্ট্রিং দেয়। কোনও বস্তুকে পরিবর্তনযোগ্য করে তোলা, পদ্ধতিটি বদলাবে না। এটিকে পরিবর্তনযোগ্য করার অর্থ প্রযুক্তিগতভাবে, আপনি এটি তৈরি করতে পারেন যাতে স্ট্রিংগুলি একটি নতুন তৈরি করার পরিবর্তে মূল স্ট্রিংটিকে পরিবর্তন করতে পারে।


একই স্ট্রিংটি যদি সংশোধিত ও নির্ধারিত হয় তবে স্ট্রিংটি var str = 'foo' আপডেট করবে; str = str.substr (1)); // oo সতর্কতা (str); // oo
আশ্বিন জি

কোড নীচে সম্পর্কে কি। স্ট্রিংয়ের মান এখন পরিবর্তন করা হয়েছে। var name = "সন্তোষ"; console.log (name.substr (0,2)); var নাম = "কুমার" কনসোল.লগ (নাম); কীভাবে এটি এখনও অপরিবর্তনীয়
সন্তোষ

97

নিম্ন স্তরে, অপরিবর্তনীয়তা মানে স্ট্রিংটিতে থাকা মেমরিটির পরিবর্তন করা হবে না। একবার আপনি একটি স্ট্রিং তৈরি "foo"করেন, মান সংরক্ষণের জন্য কিছু মেমরি বরাদ্দ করা হয় "foo"। এই স্মৃতি পরিবর্তন করা হবে না। আপনি যদি স্ট্রিংটি পরিবর্তন করে বলেন, বলুন, substr(1)একটি নতুন স্ট্রিং তৈরি হয় এবং মেমরির একটি আলাদা অংশ বরাদ্দ করা হয় যা সংরক্ষণ করবে "oo"। এখন আপনার স্মৃতিতে দুটি স্ট্রিং রয়েছে "foo"এবং "oo"। এমনকি যদি আপনি "foo"আর ব্যবহার না করেন তবে এটি আবর্জনা সংগ্রহ না করা অবধি এটি আটকে থাকবে।

স্ট্রিং অপারেশন তুলনামূলকভাবে ব্যয়বহুল হওয়ার একটি কারণ।


1
সংখ্যাগুলিও অপরিবর্তনীয়।
আরএন কুশওয়াহা

3
হ্যালো 2015 থেকে !! "নিম্ন স্তরে, অপরিবর্তনীয়তা মানে স্ট্রিংটি মেমরিটিতে থাকা মেমোরিটি পরিবর্তন করা হবে না" "--- এটি খুব সীমাবদ্ধ এবং সঠিক শব্দও মনে হয় না। অপরিবর্তনীয়তা কেবল ব্যবহারকারীর দেশ সম্পর্কে, ভাষার স্পেসিফিকেশন ইনগ্রেন্টগুলি রাখার সাথে সাথে মেমরি বরাদ্দকারী পছন্দ করায় ভার্চুয়াল মেমরিটি পরিবর্তিত হতে পারে।
zerkms

2
এই উত্তরটি স্বীকৃত উত্তরের চেয়ে আরও যুক্তিযুক্ত।
এজাজ করিম

তবে আমি var str = 'foo' এর মতো করতে পারি; আমি str = 'বার' এর মাধ্যমে সংশোধন করতে পারি। স্ট্রিং মান ঠিক এইভাবে সংশোধন করা হয়েছে?
হ্যাকার

@ হ্যাকার নাপ আপনি মেমরির একটি নতুন অবস্থানের দিকে নির্দেশ করে চলকটির জন্য একটি নতুন স্ট্রিং বরাদ্দ করেছেন।
প্রতারণা করুন

13

অপরিবর্তনীয় অর্থ যা পরিবর্তন বা সংশোধন করা যায় না।

সুতরাং আপনি যখন কোনও স্ট্রিংকে একটি মূল্য নির্ধারণ করেন, এই মানটি প্রতিস্থাপনের বিপরীতে স্ক্র্যাচ থেকে তৈরি করা হয়। সুতরাং প্রতিবার একই স্ট্রিংয়ে একটি নতুন মান নির্ধারিত হওয়ার সাথে সাথে একটি অনুলিপি তৈরি করা হয়। সুতরাং বাস্তবে, আপনি কখনই মূল মান পরিবর্তন করছেন না।


9

আমি জাভাস্ক্রিপ্ট সম্পর্কে নিশ্চিত নই, তবে জাভাতে স্ট্রিংগুলি "স্ট্রিং কনস্ট্যান্ট পুল" দিয়ে অপরিবর্তনীয়তার জন্য একটি অতিরিক্ত পদক্ষেপ নেয়। স্ট্রিংগুলি স্ট্রিং লিটারেল ( "foo") বা Stringশ্রেণি নির্মাতার সাথে তৈরি করা যেতে পারে । স্ট্রিং লিটারেলগুলি দিয়ে নির্মিত স্ট্রিংগুলি স্ট্রিং কনস্ট্যান্ট পুলের একটি অংশ এবং একই স্ট্রিং আক্ষরিকটি সর্বদা পুল থেকে একই মেমরি ঠিকানা হবে।

উদাহরণ:

    String lit1 = "foo";
    String lit2 = "foo";
    String cons = new String("foo");

    System.out.println(lit1 == lit2);      // true
    System.out.println(lit1 == cons);      // false

    System.out.println(lit1.equals(cons)); // true

উপরের দিকে lit1এবং উভয়ই lit2একই স্ট্রিং আক্ষরিক ব্যবহার করে নির্মিত হয়েছে, তাই তারা একই মেমরি ঠিকানার দিকে ইশারা করছে; lit1 == lit2ফলাফলগুলি হ'ল trueকারণ তারা ঠিক একই জিনিস।

তবে consক্লাস কনস্ট্রাক্টর ব্যবহার করে নির্মিত হয়। যদিও প্যারামিটার একই স্ট্রিং ধ্রুবক, কনস্ট্রাক্টর এর জন্য নতুন মেমরি বরাদ্দ করে cons, অর্থ একই ডেটা থাকা সত্ত্বেও এবং consএকই বস্তু নয় ।lit1lit2

অবশ্যই, যেহেতু তিনটি স্ট্রিংয়ে একই বর্ণের ডেটা রয়েছে তাই equalsপদ্ধতিটি ব্যবহার করে সত্যটি ফিরে আসবে।

(উভয় ধরণের স্ট্রিং নির্মাণ অবশ্যই অপরিবর্তনীয়)


3

অপরিবর্তনীয় মানে মান পরিবর্তন করা যায় না। একবার স্ট্রিং অবজেক্ট তৈরি করা গেলে তার পরিবর্তনযোগ্য হিসাবে পরিবর্তন করা যায় না। আপনি যদি স্ট্রিংয়ের একটি স্ট্রিংয়ের অনুরোধ করেন তবে অনুরোধ করা অংশ সহ একটি নতুন স্ট্রিং তৈরি করা হবে।

স্ট্রিংস বাফার ব্যবহার করে স্ট্রিংগুলির পরিবর্তে অপারেশনটি আরও দক্ষ করে তোলে কারণ স্ট্রিংবফার অক্ষর অ্যারের ক্ষমতা এবং অ্যারের দৈর্ঘ্য ধরে রাখার জন্য অক্ষর অ্যারেতে একটি অক্ষর অ্যারে স্ট্রিং সংরক্ষণ করে (একটি চর অ্যারে আকারে স্ট্রিং)


3

পরিবর্তনের পাঠ্য বইয়ের সংজ্ঞা দায়বদ্ধ বা পরিবর্তন বা পরিবর্তনের সাপেক্ষে। প্রোগ্রামিংয়ে আমরা এই শব্দটি ব্যবহার করি যার অর্থ সময়ের সাথে সাথে রাষ্ট্রের পরিবর্তন করার অনুমতি দেওয়া হয় objects অপরিবর্তনীয় মান হ'ল বিপরীত - এটি তৈরির পরে, এটি কখনই পরিবর্তন করতে পারে না।

যদি এটি অদ্ভুত বলে মনে হয়, তবে আমাকে আপনাকে মনে করিয়ে দেওয়ার অনুমতি দিন যে আমরা সমস্ত সময় ব্যবহৃত মানগুলি বাস্তবে অপরিবর্তনীয়।

var statement = "I am an immutable value";
var otherStr = statement.slice(8, 17);

আমি মনে করি যে দ্বিতীয় লাইনটি কোনওভাবেই বিবৃতিতে স্ট্রিং পরিবর্তন করে না তা জানতে পেরে কেউ অবাক হবে না। প্রকৃতপক্ষে, কোনও স্ট্রিং পদ্ধতি তাদের চালিত স্ট্রিং পরিবর্তন করে না, তারা সকলেই নতুন স্ট্রিং ফিরিয়ে দেয়। কারণটি হ'ল স্ট্রিংগুলি অপরিবর্তনীয় - এগুলি পরিবর্তন করতে পারে না, আমরা কেবল নতুন স্ট্রিং তৈরি করতে পারি।

স্ট্রিংগুলি জাভাস্ক্রিপ্টে নির্মিত একমাত্র পরিবর্তনযোগ্য মান নয়। সংখ্যাগুলিও অপরিবর্তনীয়। আপনি কি এমন পরিবেশের কল্পনা করতে পারেন যেখানে 2 + 3 প্রকাশের মূল্যায়ন 2 সংখ্যাটির অর্থ পরিবর্তন করে? এটি অযৌক্তিক শোনায়, তবুও আমরা আমাদের অবজেক্টগুলির সাথে এবং সারাক্ষণ অ্যারে করি।


2

স্ট্রিং থেকে স্ট্যাকস পর্যন্ত ... এরিক লিপার্টের ব্লগ থেকে নেওয়া সহজ উদাহরণটি :

সি # 3.0 এ, * ব্যবহার করে পাথ সন্ধান করুন, পার্ট টু ...

সিস্টেম.কলেশন.জেনারিক.স্ট্যাকের মতো একটি পরিবর্তনীয় স্ট্যাক স্পষ্টভাবে উপযুক্ত নয়। আমরা একটি বিদ্যমান পথ অবলম্বন করতে এবং এর সর্বশেষ উপাদানটির প্রতিবেশীর সকলের জন্যই নতুন পথ তৈরি করতে সক্ষম হতে চাই, তবে স্ট্যান্ডকে স্ট্যাকটি সংশোধন করে একটি নতুন নোড চাপানো। স্ট্যাকটি চাপ দেওয়ার আগে আমাদের অনুলিপিগুলি তৈরি করতে হবে, এটি নির্বোধ কারণ তখন আমরা অযথাই এর সমস্ত বিষয়বস্তু নকল করতে চাই।

অপরিষ্কার স্ট্যাকের এই সমস্যা নেই। অপরিবর্তনীয় স্ট্যাকের দিকে ধাক্কা দেওয়া কেবল একটি ব্র্যান্ড-নতুন স্ট্যাক তৈরি করে যা পুচ্ছটির সাথে এর লেজ হিসাবে লিঙ্ক করে। যেহেতু স্ট্যাকটি পরিবর্তনযোগ্য নয়, তাই অন্য কোনও কোড বরাবর আগমন এবং লেজের সামগ্রীগুলি নিয়ে গণ্ডগোলের ঝুঁকি নেই। আপনি আপনার হৃদয়ের সামগ্রীতে পুরানো স্ট্যাক ব্যবহার চালিয়ে যেতে পারেন।

অপরিবর্তনীয়তাকে আরও কমানোর বিষয়ে আরও গভীরভাবে জানতে, এরিকের পোস্টগুলি এটি দিয়ে শুরু করে পড়ুন:

সি # পার্ট ওনে অপরিবর্তনীয়তা: অপরিবর্তনীয়তা


এই উক্তিতে একটি অদ্ভুত দাবি রয়েছে - যে স্ট্যাকের ডেটা স্ট্রাকচার (আসলে লেজ ভাগ করে নেওয়ার সাথে একাধিক স্ট্যাক) সামগ্রিকভাবে একটি পরিবর্তনীয় কাঠামো - প্রতিটি ধাক্কা বা পপ কাঠামো পরিবর্তন করে। কেবলমাত্র পৃথক আইটেমগুলি অপরিবর্তনীয়। এবং নীতিগতভাবে, আপনার একই কাঠামো থাকতে পারে তবে পরিবর্তনীয় উপাদানগুলির সাথে। এটি Undoable ইউনিয়ন-আইআইআরসি-এর কিছু পরিবর্তনে ঘটে। অপরিচ্ছন্নতার বড় সুবিধা রয়েছে, তবে একটি অপ্টিমাইজেশান হিসাবে অংশ বা সমস্ত ডেটা স্ট্রাকচার ভাগ করে নেওয়া পার্শ্ববর্তীদের সাথে পুরোপুরি সম্ভব। এমনকি আপনি যদি অন্য রেফারেন্সগুলির জন্য আপাত অপরিবর্তনীয়তা চান, আপনি সর্বদা প্রয়োজন অনুসারে অনুলিপি করতে পারেন।
স্টিভ 314

0

এই ধারণাটি উপলব্ধি করার এক উপায় হ'ল জাভাস্ক্রিপ্ট কীভাবে সমস্ত বস্তুর সাথে আচরণ করে, তা রেফারেন্স অনুসারে। এর অর্থ যে তাত্ক্ষণিক হওয়ার পরে সমস্ত বস্তু পরিবর্তনযোগ্য , এর অর্থ আপনি নতুন পদ্ধতি এবং বৈশিষ্ট্য যুক্ত কোনও বস্তু যুক্ত করতে পারেন। এটি গুরুত্বপূর্ণ কারণ আপনি যদি কোনও বস্তুটি পরিবর্তনযোগ্য হতে চান তবে তাত্ক্ষণিক হওয়ার পরে অবজেক্টটি পরিবর্তন করতে পারে না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.