অপরিবর্তনীয়তা প্রায় আমার মাথা পেতে


13

আমি অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ে নতুন এবং একটি ধারণা যা আমাকে বুঝতে সময় লাগছে তা হ'ল অপরিবর্তনীয়তা। আমি মনে করি গত রাতে হালকা বাল্বটি বন্ধ হয়ে গেছে তবে আমি যাচাই করতে চাই:

যখন আমি এমন বিবৃতি পেলাম যে অপরিবর্তনীয় বস্তুটি পরিবর্তন করা যায় না, তখন আমি বিস্মিত হই কারণ আমি উদাহরণস্বরূপ নিম্নলিখিতটি করতে পারি:

NSString *myName = @"Bob";
myName = @"Mike";

সেখানে, আমি সবেমাত্র আমার নাম পরিবর্তন করেছি, অপরিবর্তনীয় টাইপ এনএসএসস্ট্রিংয়ের। আমার সমস্যাটি হ'ল "অবজেক্ট" শব্দটি মেমরির প্রকৃত বস্তু বা অ্যাবস্ট্রাকশন "মাইনেম" বোঝায়। পূর্বের সংজ্ঞা অপরিবর্তনীয় ধারণার ক্ষেত্রে প্রযোজ্য।

পরিবর্তনশীল হিসাবে, অপরিবর্তনীয়তার আরও স্পষ্ট (আমার কাছে) সংজ্ঞাটি হ'ল অপরিবর্তনীয় বস্তুর মান কেবল তার অবস্থানের স্মৃতিতে পরিবর্তনের মাধ্যমে পরিবর্তিত হতে পারে, অর্থাত্ এর রেফারেন্স (এটি তার পয়েন্টার হিসাবে পরিচিত)।

এটি কি সঠিক, না আমি এখনও জঙ্গলে হারিয়েছি?


13
আপনার প্রকারটি কোনও নয় NSString, এটি একটি " নির্দেশক এবং NSString", যা স্থাবর নয়। আমি উদ্দেশ্য C- এর কিছুই জানি না, কিন্তু আমি আপনার উদাহরণ যে অনুমান করছি @"Mike"একটি নতুন দৃষ্টান্ত তৈরি করছে NSStringএবং তা নির্ধারণের পয়েন্টার , myName। সুতরাং আপনি যে বস্তুটির myNameদিকে ইশারা করছিলেন সেটিকে আপনি পরিবর্তন করেননি , কেবল এটি কী নির্দেশ করছে।
fwgx

2
@fwgx এটিকে উত্তর হিসাবে রাখুন এবং আপনি আমার উত্সাহ পাবেন।
গুলশান

সমস্ত জবাবের জন্য আপনাকে সবাইকে ধন্যবাদ, তারা খুব সহায়ক। আমি এখন বুঝতে পারি যে অপরিবর্তনীয় বস্তু হ'ল মেমরির মান, ভেরিয়েবলটি এটিতে নির্দেশ করে না।
মাইকেল ম্যানগোল্ড

@ গুলশান সম্পন্ন, নীচে দেখুন ....
fwgx

অপরিবর্তনীয়তা বুঝতে, আমি এমন একটি প্রোগ্রামিং ল্যাঙ্গুয়েজ শিখার পরামর্শ দিচ্ছি যা স্পষ্টভাবে বাইন্ডিংকে পৃথক করে (অর্থাত্‍ বস্তুগুলিকে নাম দেওয়া) পরিবর্তনের সাথে (অর্থাত্‍ কোনও নামকে অন্য কোনও বস্তুর কাছে পুনঃনির্ধারণের অনুমতি দেওয়া)। এমএল (কোনও ছদ্মবেশে: এসএমএল, ওক্যামেল, এফ #) একটি ভাল উদাহরণ।
গিলস 23'23

উত্তর:


4

দেখে মনে হচ্ছে আপনি সঠিক পথে যাচ্ছেন তবে এখনও তা পেলেন না। এটা ভুল:

সেখানে, আমি সবেমাত্র আমার নাম পরিবর্তন করেছি, অপরিবর্তনীয় টাইপ এনএসএসস্ট্রিংয়ের। আমার সমস্যাটি হ'ল "অবজেক্ট" শব্দটি মেমরির প্রকৃত বস্তু বা অ্যাবস্ট্রাকশন "মাইনেম" বোঝায়।

আপনার কোড স্নিপেটে, myNameঅপরিবর্তনীয় টাইপের নয় NSString, এটি পরিবর্তনীয় প্রকারের NSString*(এনএসএসস্ট্রিংয়ের দিকে নির্দেশক)। মনে হচ্ছে আপনি যে মূল জিনিসটি মিস করছেন তা বুঝতে পয়েন্টারটি হ'ল অন্য একটি মান এবং এটি যে বিষয়টিকে নির্দেশ করে তার থেকে সম্পূর্ণ পৃথক জীবন রয়েছে (বা জিনিসগুলি, যদি আপনি এটির আজীবন অংশে পরিবর্তন করেন)।

তুমি বলো:

... একটি অপরিবর্তনীয় বস্তুর মান কেবল তার অবস্থানের স্মৃতিতে পরিবর্তন করে পরিবর্তিত হতে পারে, যেমন এর রেফারেন্স (এটির নির্দেশক হিসাবেও পরিচিত)।

এটা ভুল. একটি বস্তু নেই মালিক এটি পয়েন্টার যে বিন্দু, কিংবা একটি বস্তু স্মৃতিতে অবস্থান হয় নিয়ন্ত্রিত বা অন্যথায় এটা কোনো পয়েন্টার দ্বারা প্রভাবিত।

সুতরাং, NSStringআপনার উদাহরণে ( @"Bob"এবং @"Mike") দুটি বস্তু myNameভেরিয়েবল থেকে সম্পূর্ণ পৃথক । তারা একে অপরের থেকে সম্পূর্ণ পৃথক। আপনি যখন myNameনির্দেশ করার @"Mike"পরিবর্তে পয়েন্টে পরিবর্তন করেন @"Bob", আপনি NSStringবস্তুগুলি পরিবর্তন করছেন না ।


সম্পূর্ণতার জন্য, আমি নোট করব যে আবর্জনা সংগ্রহকারীরা এটি আরও জটিল করে তোলে যাতে পয়েন্টারে পরিবর্তিত হওয়া বস্তুগুলি তারা নির্দেশিত বস্তুগুলিকে প্রভাবিত করতে পারে (সম্পাদনা)। তবে এটি একটি বাস্তবায়ন বিশদ যা কোডটির পর্যবেক্ষণযোগ্য আচরণকে প্রভাবিত করবে না should


17

আপনি কথায় হারিয়েছেন। অপ্রচলতার অর্থ: যতক্ষণ আপনি পরিবর্তনশীলটি পরিবর্তন করবেন না, ততক্ষণ আপনি সর্বদা একই মানটি "ধারণ" করে রাখবেন, আপনি অন্যান্য ভেরিয়েবলগুলির সাথে কী করেন তা বিবেচ্য নয়।

সিতে প্রতিবিম্ব (উদাহরণটি কিছুটা সরল, একটি আর্কিটেকচার যা এটির অনুমতি দেয়)

 char *a = "Hello World";
 char *b = a;
 b[0] = 'Y';

এখন আর "হ্যালো ওয়ার্ল্ড" স্ট্রিংটি "থাকে না" (অর্থাত্ পয়েন্টগুলি) থাকে না, তবে এটি পরিবর্তে এটি "ইয়েলো ওয়ার্ল্ড" থাকে।

জাভা এবং (EDIT: নিরাপদ) সি # এর মতো স্ট্রিংগুলি অপরিবর্তনীয় এমন ভাষাগুলিতে আপনি এটি করতে পারবেন না। কোনভাবেই না. এর অর্থ হ'ল প্রোগ্রামটির প্রতিটি অংশ নিরাপদে স্ট্রিংয়ের একটি রেফারেন্স রাখতে পারে এবং নির্ভর করতে পারে যে এর সামগ্রীগুলি কখনই পরিবর্তন হয় না; অন্যথায়, তাদের কেবল নিরাপদ দিকে থাকতে একটি অনুলিপি তৈরি করতে হবে।

তবে পরিবর্তনশীল এখনও পরিবর্তনীয়। আপনি এটি অন্য কোনও বস্তুর দিকে নির্দেশ করতে পারেন। এটি ঠিক যে অবজেক্টটি নিজের পিছনে পিছনে পরিবর্তন হবে না।


1
আপনি প্রযুক্তিগতভাবে সি # তে স্ট্রিংয়ের সামগ্রী পরিবর্তন করতে পারেন , আপনাকে কেবল unsafeকোড ব্যবহার করতে হবে ।
অ্যারোনআউট

1
অ্যারোনআউট: তথ্যের জন্য ধন্যবাদ, আপনি ঠিক বলেছেন; : সবাই কে কিভাবে দরকার জন্য msdn.microsoft.com/en-us/library/ms228599.aspx
user281377

10

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

বস্তুকে একটি উচ্চস্বরে, মাতাল প্রতিবেশী হিসাবে ভাবেন। তিনি যদি যুক্তিযুক্ত (পরিবর্তনীয়) হন তবে আপনি তাঁর দরজায় কড়া নাড়তে এবং এমন একটি জীবনযাত্রায় রূপান্তর করতে সক্ষম হতে পারেন যেখানে তিনি ততটা শব্দ করেন না। তবে তিনি যদি পরিবর্তনযোগ্য না হন তবে আপনার একমাত্র পরিবর্তনটি আশা করা যায় যে অন্য কেউ প্রবেশ করেছেন!


3
আমার কিছু প্রতিবেশী ছিল যে আমি নিঃশব্দ করতে পছন্দ করতাম।
ডেভ নায়

আপনার ব্যাখ্যাটি যথেষ্ট ভাল বলে আমার মনে হয় না যে আপনার দ্বিতীয় অনুচ্ছেদে আপনার উদাহরণের দরকার আছে। আইএমও উদাহরণটি বিভ্রান্ত করতে পারে। তবে অধ্যায়ের প্রশ্নের সাস্পটিক উত্তরের জন্য +1।
পল ম্যাককেবে

@ ডেভনে: আমি স্টিলথ শ্লেষের জন্য ক্ষমা চাইছি। মোটেই উদ্দেশ্য ছিল না।
কিলিয়ান ফট

6

একটি ভেরিয়েবল কোনও বস্তু নয়। একটি চলক একটি নাম, যা কোনও বস্তুকে বোঝায় (বা আরও সাধারণভাবে একটি মান)।

উদাহরণস্বরূপ "গোলকিপার" হ'ল একটি নাম যা আমরা লক্ষ্য রক্ষার জন্য দায়ী ব্যক্তি (ব্যক্তি) কে বোঝাতে ব্যবহার করি। তবে আমি যদি সেই ব্যক্তিকে অন্য একজনের পরিবর্তে স্থান দান করি (কারণ প্রাক্তন আহত হয় বা কী না) তবে নতুন ব্যক্তিকে এখন "গোলরক্ষক" হিসাবে উল্লেখ করা হয়।

অ্যাসাইনমেন্ট স্টেটমেন্টটি যা ভেরিয়েবলগুলিকে পরিবর্তনযোগ্য করে তোলে (কিছু ভাষা যেমন হাস্কেলের কাছে নেই এবং বাস্তবে অপরিবর্তনীয় ভেরিয়েবলগুলি ব্যবহার করে)। এটি আপনাকে একটি নামের অর্থ নতুন করে সংজ্ঞায়িত করতে এবং এর মাধ্যমে মানটিকে পুনরায় নির্ধারণ করতে দেয়।

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

পরিবর্তনশীল এবং মান উভয়ই অপরিবর্তনীয় হতে পারে (স্বতন্ত্রভাবে)। এই ক্ষেত্রে, এটি অপরিবর্তনীয় যে বস্তুগুলি। একবার আপনি একটি নির্মাণ করুন NSString, আপনি এটি পরিবর্তন করতে পারবেন না। আপনি এটিকে নাম বলতে পারেন এবং এটি পাস করতে পারেন তবে এটি একই থাকবে। এর বিপরীতে, NSMutableStringসৃষ্টির পরে পরিবর্তন করা যেতে পারে, উদাহরণস্বরূপ setStringপদ্ধতিটি কল করে ।


ওয়াগগুওগা তুলনা ভালোবাসি!
মাইকেল কে

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

4

আমি মনে করি আপনি হারিয়ে গেছেন, কারণ আপনি দুটি ধারণার মিশ্রণ করছেন: নিজেই বস্তু এবং সেই বস্তুর সাথে আবদ্ধ পরিবর্তনশীল নাম।

অপরিবর্তনীয় বস্তু পরিবর্তন করা যায় না। সময়কাল। যাইহোক, পরিবর্তনীয় নাম (প্রতীক) একটি অপরিবর্তনীয় বস্তুর সাথে আবদ্ধ, অন্য অপরিবর্তনীয় বস্তুর সাথে আবদ্ধ হতে সংশোধন করতে পারে ।

অন্য কথায়, আপনি এই দুটি লাইনে যা করেছেন তা হ'ল:

  1. "বব" মান সহ অপরিবর্তনীয় স্ট্রিং অবজেক্ট তৈরি করুন
  2. প্রতীকটি myNameসেই বস্তুর সাথে আবদ্ধ করুন
  3. "মাইক" মান সহ অপরিবর্তনীয় স্ট্রিং অবজেক্ট তৈরি করুন
  4. প্রতীকটি myNameসেই বস্তুর সাথে আবদ্ধ করুন

2

তোমার আপনার টাইপ একটি নয় NSStringএটি একটি "হয়, পয়েন্টার একটি NSString", যা অপরিবর্তনীয় নয়। আমি উদ্দেশ্য সি এর কিছুই জানি না, তবে আমি আপনার উদাহরণটিতে অনুমান করছি যে @"Mike"এটি একটি নতুন উদাহরণ তৈরি NSStringকরছে এবং এটি পয়েন্টারকে নির্ধারণ করছে myName। সুতরাং আপনি যে বস্তুটির দিকে ইশারাmyName করছিলেন সেটিকে আপনি পরিবর্তন করেননি , কেবল এটি কী নির্দেশ করছে।


0

এখানে একটি পরিবর্তনীয় বস্তুর উদাহরণ: charসি এর একটি অ্যারে :

char str[10];

আমি পরিবর্তন করতে পারেন বিষয়বস্তু এর str(এতক্ষণ এটা 10 অক্ষরের চেয়ে বেশি অক্ষর হিসাবে) আমার মনের মতো সামগ্রীর। এটি স্ট্রিং হিসাবে সি স্ট্রিং লাইব্রেরির ক্রিয়াকলাপ দ্বারা স্বীকৃত হওয়ার জন্য, সেখানে একটি চলন্ত 0 থাকতে হবে, সুতরাং এটি দৈর্ঘ্যে 9 টি অক্ষর পর্যন্ত স্ট্রিং ধরে রাখতে পারে:

strcpy(str, "hello"); // str now contains the string "hello\0"
strcpy(str, "world"); // str now contains the string "world\0"

str[0] = 'W';         // str now contains "World\0"

আন্ড তাই ওয়েটার

এটি জাভাতে একটি স্ট্রিং অবজেক্টের সাথে বিপরীতে করুন:

String foo = "Hello";

স্ট্রিং উদাহরণ (মেমরির অংশ যা 'এইচ', 'ই', 'ল', 'এল', এবং 'ও' অক্ষর ধারণ করে) সংশোধন করা যায় না; আমি সেই স্ট্রিংয়ের যে কোনও বিষয়বস্তু পরিবর্তন করতে পারি না। আপনি যখন কিছু লিখুন

foo = foo + " World";

আপনি "হ্যালো" উদাহরণের শেষে "ওয়ার্ল্ড" যুক্ত করছেন না; আপনি একটি নতুন উদাহরণ তৈরি করছেন , এটিতে "হ্যালো ওয়ার্ল্ড" অনুলিপি করছেন এবং fooসেই নতুন স্ট্রিংয়ের উদাহরণটি উল্লেখ করার জন্য আপডেট করছেন।

fooস্ট্রিং উদাহরণটি নিজেই থাকে না; এটি কেবলমাত্র সেই উদাহরণটিকে বোঝায় (সি বা ওবজে-সি-তে একটি পয়েন্টারের অনুরূপ), সুতরাং স্ট্রিংয়ের মতো প্রকারকে কেন রেফারেন্স প্রকার বলা হয়।

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