paint-brush
পরিবর্তনযোগ্য রেফারেন্স বা পরিবর্তনযোগ্য ভেরিয়েবল? ডিকোডিং মরিচা এর mut-mut-mutদ্বারা@charnog
883 পড়া
883 পড়া

পরিবর্তনযোগ্য রেফারেন্স বা পরিবর্তনযোগ্য ভেরিয়েবল? ডিকোডিং মরিচা এর mut-mut-mut

দ্বারা Denis Gonchar5m2023/09/23
Read on Terminal Reader
Read this story w/o Javascript

অতিদীর্ঘ; পড়তে

মরিচা এর মেমরি সুরক্ষা এর মালিকানা এবং ধার নেওয়ার প্রক্রিয়ার মধ্যে নিহিত। এই নিবন্ধটি mut কীওয়ার্ডের জটিলতাগুলি নিয়ে আলোচনা করে, পরিবর্তনযোগ্য রেফারেন্স এবং পরিবর্তনযোগ্য ভেরিয়েবলের মধ্যে পার্থক্য করে। কী টেকঅ্যাওয়ে? সমস্ত মিউট সমানভাবে তৈরি হয় না: পরিবর্তনযোগ্য রেফারেন্স পয়েন্টেড-টু মান পরিবর্তন করার অনুমতি দেয়, যেখানে রেফারেন্স সহ মিউটেবল ভেরিয়েবল যেখানে নির্দেশ করে সেখানে পরিবর্তন করতে পারে। = চিহ্ন ব্যবহার করে একটি সহজ ভিজ্যুয়ালাইজেশন কৌশল এই পার্থক্যগুলি বোঝা সহজ করে।
featured image - পরিবর্তনযোগ্য রেফারেন্স বা পরিবর্তনযোগ্য ভেরিয়েবল? ডিকোডিং মরিচা এর mut-mut-mut
Denis Gonchar HackerNoon profile picture

ভূমিকা

যদিও মরিচা তার মরিচা বই সরবরাহ করে, আমি mut কীওয়ার্ড বোঝার সাথে লড়াই করেছি। আমি নিজেকে জিজ্ঞাসা করলাম, "আমিই কি একমাত্র এই সমস্যাটি আছে?" একটি দ্রুত Google অনুসন্ধান নিশ্চিত করেছে যে আমি একা নই।


ফলস্বরূপ, আমি mut কীওয়ার্ডের বিশদ ব্যাখ্যা প্রদানের জন্য এই নিবন্ধটি লেখার সিদ্ধান্ত নিয়েছি। এই নিবন্ধটি তাদের জন্য যারা পাইথন বা জাভাস্ক্রিপ্টের মতো উচ্চ-স্তরের ভাষা থেকে এসেছেন।

ভেরিয়েবল

Rust এ একটি অপরিবর্তনীয় ভেরিয়েবল তৈরি করতে, শুধু let x = 1337 লিখুন। এটা সোজা. আপনি যদি এমন একটি ভেরিয়েবল তৈরি করতে চান যা পরে মিউটেশন করা যায়, তাহলে let এর পরে mut কীওয়ার্ড যোগ করুন। মরিচা একটি সহায়ক সম্মেলন আছে যা উদ্দেশ্যের স্পষ্টতাকে উৎসাহিত করে।


mut কীওয়ার্ড যোগ করলে অন্যদের জানানো হয় যে এই ভেরিয়েবলটি কোডের অন্য কোথাও পরিবর্তন করা হবে। ঠিক আছে.


এর কল্পনা করা যাক. এখানে দুটি ভেরিয়েবল, let mut x = 1337 এবং let y = 42

নামের প্রথম অংশ; দ্বিতীয় - প্রকার, তৃতীয় - মান, চতুর্থ - mut পতাকা।

উল্লেখ

এই মুহুর্তে, সবকিছু সোজা। যাইহোক, mut রেফারেন্স ব্যবহার করার সময় জিনিসগুলি একটু কোঁকড়া হতে শুরু করে। এর কিছু তৈরি করা যাক.

 let mut x = 1337; let y = 42; let x_ref = &mut x; let y_ref = &y;


আমি দুটি রেফারেন্স তৈরি করেছি (বা মরিচা পরিপ্রেক্ষিতে "ধার করা")। তাদের মধ্যে একটি পরিবর্তনযোগ্য রেফারেন্স, এবং অন্যটি শুধুমাত্র পঠনযোগ্য রেফারেন্স। এর জন্য আবার একটি স্কিম তৈরি করা যাক।


প্রদত্ত স্কিমে, আমার কাছে 4টি ভেরিয়েবল রয়েছে, যার মধ্যে 2টি রেফারেন্স। উভয় রেফারেন্স ভেরিয়েবল অপরিবর্তনীয় এবং let এর পরে mut কীওয়ার্ড নেই, যার মানে তারা যা নির্দেশ করে তা আমি পরিবর্তন করতে পারি না। যাইহোক, আমি এখনও তাদের উল্লেখ করা মান পরিবর্তন করতে পারি।

 *x_ref = 777;


আপনি যদি এটি লেখেন, তাহলে মরিচা কম্পাইলার অভিযোগ করবে না এবং x এর মান (রেফ নিজেই নয়) 777 এ পরিবর্তিত হবে। যাইহোক, স্কিমটিতে একটি লাল বর্গক্ষেত্র রয়েছে যা নির্দেশ করে যে x_ref পরিবর্তনযোগ্যতার বিকল্প নেই। সুতরাং, কেন আমি এটি উল্লেখ করা মান পরিবর্তন করতে পারি?


আসুন let x_ref = &mut x এর স্কিমে ফিরে আসি।


প্রথম সাদা ব্লকের নামটি রয়েছে: x_ref । দ্বিতীয় এক যে পরিবর্তনশীল সংরক্ষিত টাইপ সম্পর্কে আমাকে অবহিত. এর সম্পূর্ণ আকারে, কোন অন্তর্নিহিত টাইপ টীকা ছাড়াই, আমি নিম্নরূপ লিখতে পারি:

 let x_ref: &mut i32 = &mut x;


আমি এটিকে এভাবে ব্যাখ্যা করতে পারি: আসুন x_ref নামে একটি অপরিবর্তনীয় ভেরিয়েবল তৈরি করি যা i32 এর একটি পরিবর্তনযোগ্য রেফারেন্স ধারণ করবে এবং x ভেরিয়েবলের i32 মানের পরিবর্তনযোগ্য রেফারেন্স দিয়ে অবিলম্বে এটিকে আরম্ভ করবে।


এর মানে আমি যে মানটি নির্দেশ করে তা পরিবর্তন করতে পারি, কিন্তু আমি রেফারেন্সের মান (বা ঠিকানা) পরিবর্তন করতে পারি না। অন্য কথায়, আমি এরকম কিছু লিখতে পারি না:

 let x_ref: &mut i32 = &mut x; let mut z = 0; x_ref = &mut z; // Not allowed!


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


তীরের দিক পরিবর্তন করতে, আমাকে x_ref ভেরিয়েবলে সংরক্ষিত ঠিকানা পরিবর্তন করতে হবে। যাইহোক, আমি এটি করতে পারি না কারণ পরিবর্তনশীলটি অপরিবর্তনীয়।


চল এটা করি!

 let mut x: i32 = 1337; let mut x_ref: &mut i32 = &mut x; // I've added mut before x_ref let mut z = 0; x_ref = &mut z; // Allowed!


এখানে x_ref আশেপাশে mut অনেকগুলি উদাহরণ রয়েছে, তাই না? আসুন তাদের বর্ণনা করি।


  1. let mut x_ref : আমি x_ref নামে একটি পরিবর্তনযোগ্য ভেরিয়েবল তৈরি করছি, যার মানে আমি পরে এর মান পরিবর্তন করতে পারি।


  2. &mut i32 : আমি বলছি যে ভেরিয়েবলটিতে i32 প্রকারের কিছু মানের পরিবর্তনযোগ্য রেফারেন্স(গুলি) থাকবে।


  3. &mut x : আমি পরিবর্তনশীল x ধার করছি (এর একটি রেফারেন্স পাচ্ছি)।


তারপর, আমি z নামের একটি ভেরিয়েবল তৈরি করেছি এবং এটিকে 0 এর মান নির্ধারণ করেছি। পরে, যখন আমি x_ref = &mut z লিখি, তখন আমি ইঙ্গিত দিয়েছিলাম যে আমি x_ref একটি পরিবর্তনযোগ্য পরিবর্তনশীল যা শুধুমাত্র i32 মানের রেফারেন্স ধারণ করতে পারে।


যেহেতু z এর ধরন i32 , তাই আমি x_ref ভেরিয়েবলে এর ঠিকানা বরাদ্দ করতে পারি। z এর ঠিকানা পেতে, আমি &mut z সিনট্যাক্স ব্যবহার করেছি।


স্কিম।

মানসিক কৌশল

একবার দেখুন = বিবৃতিতে, এটি কিছুটা সুস্পষ্ট দেখাতে পারে, কিন্তু…

 let mut x_ref = &mut x;


… আমি এটিকে একটি বিভাজক হিসাবে দেখি (বিশেষত যদি আপনি এটিকে 90 ডিগ্রি দ্বারা ঘোরান) যা বিবৃতিটিকে দুটি উপ-বিবৃতিতে বিভক্ত করে: বাম এবং ডান। বাম দিকটি ভেরিয়েবল সম্পর্কে তথ্য প্রদান করে, যখন ডান দিকটি আমাদের মান সম্পর্কে বলে।


যখন আমি মান পরিবর্তন করতে * dereference অপারেটর ব্যবহার করি...

 *x_ref = 100;

... আমি x_ref ভেরিয়েবলের মান পরিবর্তন করি না। পরিবর্তে, আমি x_ref রেফারেন্স করা মান পরিবর্তন করছি।

অপরিবর্তনীয় রেফারেন্স

আমি আগে প্রায়ই mut ব্যবহার. আমি তাদের কিছু বাদ দিলে কি হবে?

 let i = 1; let j = 2; let mut k = &i;


আমি কি এখানে i এর মান পরিবর্তন করতে পারি? বিভাজক কৌশল ব্যবহার করে, উত্তর দেওয়া বেশ সহজ। আমি k এর মান পরিবর্তন করতে পারি (আমি বাম দিকে mut দেখতে পাচ্ছি), কিন্তু মান (ডান দিকে) i এর একটি অপরিবর্তনীয় রেফারেন্স (এখানে কোন mut নেই)।


তাই…

 let i = 1; let j = 2; let mut k = &i; k = &j; // This is legal. *k = 3; // This is not.


স্কিম।

উপসংহার

এই নিবন্ধে, আমরা mut কীওয়ার্ড এবং রেফারেন্সের সূক্ষ্মতাগুলিকে ব্যবচ্ছেদ করেছি। মনে রাখবেন, একটি পরিবর্তনযোগ্য রেফারেন্স এবং একটি রেফারেন্স ধারণ করা একটি পরিবর্তনযোগ্য পরিবর্তনশীলের মধ্যে একটি পার্থক্য রয়েছে। আমাদের কৌশল?


রাস্টে অ্যাসাইনমেন্টগুলি আরও ভালভাবে বোঝার জন্য মানসিক বিভাজক হিসাবে = চিহ্নটি ব্যবহার করা। এই সহজ ভিজ্যুয়ালাইজেশন অনেক বিভ্রান্তি পরিষ্কার করতে পারে।


শুভ কোডিং!