যদিও মরিচা তার মরিচা বই সরবরাহ করে, আমি mut
কীওয়ার্ড বোঝার সাথে লড়াই করেছি। আমি নিজেকে জিজ্ঞাসা করলাম, "আমিই কি একমাত্র এই সমস্যাটি আছে?" একটি দ্রুত Google অনুসন্ধান নিশ্চিত করেছে যে আমি একা নই।
ফলস্বরূপ, আমি mut
কীওয়ার্ডের বিশদ ব্যাখ্যা প্রদানের জন্য এই নিবন্ধটি লেখার সিদ্ধান্ত নিয়েছি। এই নিবন্ধটি তাদের জন্য যারা পাইথন বা জাভাস্ক্রিপ্টের মতো উচ্চ-স্তরের ভাষা থেকে এসেছেন।
Rust এ একটি অপরিবর্তনীয় ভেরিয়েবল তৈরি করতে, শুধু let x = 1337
লিখুন। এটা সোজা. আপনি যদি এমন একটি ভেরিয়েবল তৈরি করতে চান যা পরে মিউটেশন করা যায়, তাহলে let
এর পরে mut
কীওয়ার্ড যোগ করুন। মরিচা একটি সহায়ক সম্মেলন আছে যা উদ্দেশ্যের স্পষ্টতাকে উৎসাহিত করে।
mut
কীওয়ার্ড যোগ করলে অন্যদের জানানো হয় যে এই ভেরিয়েবলটি কোডের অন্য কোথাও পরিবর্তন করা হবে। ঠিক আছে.
এর কল্পনা করা যাক. এখানে দুটি ভেরিয়েবল, let mut x = 1337
এবং let y = 42
।
এই মুহুর্তে, সবকিছু সোজা। যাইহোক, 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
অনেকগুলি উদাহরণ রয়েছে, তাই না? আসুন তাদের বর্ণনা করি।
let mut x_ref
: আমি x_ref
নামে একটি পরিবর্তনযোগ্য ভেরিয়েবল তৈরি করছি, যার মানে আমি পরে এর মান পরিবর্তন করতে পারি।
&mut i32
: আমি বলছি যে ভেরিয়েবলটিতে i32
প্রকারের কিছু মানের পরিবর্তনযোগ্য রেফারেন্স(গুলি) থাকবে।
&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
কীওয়ার্ড এবং রেফারেন্সের সূক্ষ্মতাগুলিকে ব্যবচ্ছেদ করেছি। মনে রাখবেন, একটি পরিবর্তনযোগ্য রেফারেন্স এবং একটি রেফারেন্স ধারণ করা একটি পরিবর্তনযোগ্য পরিবর্তনশীলের মধ্যে একটি পার্থক্য রয়েছে। আমাদের কৌশল?
রাস্টে অ্যাসাইনমেন্টগুলি আরও ভালভাবে বোঝার জন্য মানসিক বিভাজক হিসাবে =
চিহ্নটি ব্যবহার করা। এই সহজ ভিজ্যুয়ালাইজেশন অনেক বিভ্রান্তি পরিষ্কার করতে পারে।