ভেরিয়েবলস (Variables)
রাস্টে ভেরিয়েবলসের ধারণা অন্যান্য প্রোগ্রামিং ভাষার মতোই। তবে রাস্টে ভেরিয়েবল ডিক্লেয়ার করার সময় কিছু গুরুত্বপূর্ণ বিষয় রয়েছে, বিশেষত এটি immutable বা mutable হতে পারে, যা রাস্টের মালিকানা এবং মেমোরি সেফটির ধারণার সঙ্গে সংযুক্ত।
ভেরিয়েবল ডিক্লেয়ার করা:
let x = 5; // x হলো একটি immutable ভেরিয়েবলউপরে let x = 5; কোডে, x একটি immutable (অপরিবর্তনীয়) ভেরিয়েবল। এর মান একবার নির্ধারণ করা হলে, তা পরে পরিবর্তন করা যাবে না।
মিউটেবল ভেরিয়েবল (Mutable Variables):
যদি আপনি চান যে ভেরিয়েবলটি পরিবর্তনযোগ্য (mutable) হোক, তাহলে আপনাকে mut কিওয়ার্ড ব্যবহার করতে হবে।
let mut y = 10; // y হলো একটি mutable ভেরিয়েবল
y = 20; // y এর মান এখন ২০
println!("{}", y); // আউটপুট হবে ২০রাস্টে ডিফল্টভাবে সমস্ত ভেরিয়েবল immutable হয়, যার ফলে এটি ডেটার নিরাপত্তা নিশ্চিত করে।
ডেটা টাইপস (Data Types)
রাস্টে দুই ধরনের ডেটা টাইপ রয়েছে: প্রাইমেটিভ টাইপস (Primitive Types) এবং **কমপ্লেক্স টাইপস (Complex Types)**।
প্রাইমেটিভ ডেটা টাইপস:
রাস্টের প্রাইমেটিভ টাইপস হলো এমন টাইপ যা সরাসরি নির্দিষ্ট মান ধারণ করে এবং কম্পাইল টাইমে নির্ধারিত হয়। কিছু সাধারণ প্রাইমেটিভ টাইপ হলো:
- int (integer): পূর্ণসংখ্যা। যেমন:
i32,i64 - float (floating-point): দশমিক সংখ্যা। যেমন:
f32,f64 - bool: বুলিয়ান মান (সত্য অথবা মিথ্যা)। যেমন:
true,false - char: একক অক্ষর। যেমন:
'a','1' - string: একটি স্ট্রিং ডেটা টাইপ, যা সি স্টাইলের স্ট্রিং নয়, বরং রস্টের নিজের মাল্টি-বাইট Unicode স্ট্রিং।
উদাহরণ:
let x: i32 = 10; // integer
let y: f64 = 3.14; // floating-point
let is_active: bool = true; // boolean
let letter: char = 'A'; // characterকমপ্লেক্স ডেটা টাইপস:
কমপ্লেক্স ডেটা টাইপগুলি একাধিক মান ধারণ করতে পারে এবং এগুলি সাধারণত ডেটার জটিলতা এবং ক্ষমতা বাড়াতে ব্যবহৃত হয়।
- tuple: বিভিন্ন ধরনের ডেটার একটি গ্রুপ।
- array: এক ধরনের ডেটা টাইপের একাধিক মান।
উদাহরণ (Tuple):
let tuple = (10, 3.14, 'a'); // tuple containing an integer, floating-point and characterউদাহরণ (Array):
let arr = [1, 2, 3, 4, 5]; // array of integersশ্যাডোইং (Shadowing)
রাস্টে শ্যাডোইং একটি শক্তিশালী বৈশিষ্ট্য, যেখানে আপনি একই নামের ভেরিয়েবল পুনরায় ঘোষণা করতে পারেন এবং তার মান পরিবর্তন করতে পারেন, যা মূলত আগের ভেরিয়েবলকে "শ্যাডো" করে ফেলে। তবে, শ্যাডোইং করার সময় নতুন ভেরিয়েবলটি mutable হতে না পারে, যদি না আপনি mut কিওয়ার্ড ব্যবহার করেন।
শ্যাডোইং কীভাবে কাজ করে?
let x = 5; // x এর মান ৫
let x = x + 1; // x কে আবার ১ যোগ করে নতুন মান দেওয়া হলো
println!("{}", x); // আউটপুট হবে ৬এখানে, প্রথমে x কে ৫ দেওয়া হয়েছিল, এরপর x = x + 1; দিয়ে x এর মান শ্যাডো করা হয়েছে এবং নতুন মান ৬ সেট করা হয়েছে। এই শ্যাডোইংয়ের মাধ্যমে আপনি একই নামের ভেরিয়েবল নতুন মান দিতে পারেন এবং এটি একটি নতুন ভেরিয়েবল হিসেবেই গণ্য হয়।
শ্যাডোইং এর ব্যবহার
- ডেটা টাইপ পরিবর্তন: শ্যাডোইংয়ের মাধ্যমে আপনি একই নামের ভেরিয়েবলের ডেটা টাইপও পরিবর্তন করতে পারেন।
let x = 5; // x হলো i32
let x = "Hello"; // x হলো &str (স্ট্রিং)এখানে x এর প্রথম মান ছিল পূর্ণসংখ্যা (i32), পরে এটি স্ট্রিং টাইপে পরিবর্তিত হয়েছে, যেহেতু শ্যাডোইংয়ের মাধ্যমে ভেরিয়েবলটি নতুন টাইপে আবার ডিক্লেয়ার করা হয়েছে।
শ্যাডোইং এর সুবিধা:
- এটি একটি পরিষ্কার এবং সুবিধাজনক উপায়, যেখানে একই ভেরিয়েবলের মান পরিবর্তন করার প্রয়োজন হতে পারে, তবে আপনি মিউটেবল (mutable) ব্যবহার না করে এটিকে পরিবর্তন করতে পারেন।
- শ্যাডোইং ডেটা সুরক্ষিত রাখে এবং কোডের পাঠযোগ্যতা বাড়ায়।
সারাংশ
রাস্টের ভেরিয়েবল, ডেটা টাইপস এবং শ্যাডোইং এই ভাষার অন্যতম শক্তিশালী বৈশিষ্ট্য। ভেরিয়েবলস দিয়ে আপনি ডেটার মান সংরক্ষণ করতে পারেন এবং এগুলিকে mutable বা immutable করতে পারেন। ডেটা টাইপস বিভিন্ন ধরনের মানকে সঠিকভাবে সংরক্ষণ এবং পরিচালনা করতে সহায়ক। এবং শ্যাডোইং এর মাধ্যমে আপনি একই নামের ভেরিয়েবল ব্যবহার করে নতুন মান বা নতুন টাইপে ভেরিয়েবলকে পুনরায় ডিক্লেয়ার করতে পারেন, যা কোডের পাঠযোগ্যতা এবং কার্যকারিতা বৃদ্ধি করে।
ভেরিয়েবল ডিক্লারেশন (Variable Declaration)
ভেরিয়েবল ডিক্লারেশন হচ্ছে একটি ভেরিয়েবল তৈরি করার প্রক্রিয়া, যেখানে আপনি ভেরিয়েবলটির নাম এবং তার ধরন (data type) নির্ধারণ করেন। রাস্টে, ভেরিয়েবল ডিক্লারেশন দুটি প্রধান উপায়ে করা যায়: immutable এবং mutable ভেরিয়েবল।
Immutable ভেরিয়েবল
ডিফল্টভাবে, রাস্টে ভেরিয়েবলগুলি immutable হয়, অর্থাৎ একবার ভেরিয়েবলটি একটি মান পেলে সেটি আর পরিবর্তন করা যাবে না।
উদাহরণ:
fn main() {
let x: i32 = 10; // Immutable ভেরিয়েবল
println!("x = {}", x);
}এখানে, x একটি i32 টাইপের ভেরিয়েবল, এবং একবার এটি ইনিশিয়ালাইজ হওয়ার পর এটি পরিবর্তন করা যাবে না।
Mutable ভেরিয়েবল
যদি আপনি চান যে ভেরিয়েবলটির মান পরিবর্তন করা যাবে, তবে আপনাকে mut কীওয়ার্ড ব্যবহার করতে হবে। এর মাধ্যমে আপনি ভেরিয়েবলটিকে mutable (পরিবর্তনযোগ্য) বানাতে পারবেন।
উদাহরণ:
fn main() {
let mut x: i32 = 10; // Mutable ভেরিয়েবল
println!("x = {}", x);
x = 20; // এখন x এর মান পরিবর্তন করা যাবে
println!("x = {}", x);
}এখানে, mut কীওয়ার্ডের মাধ্যমে x কে mutable হিসেবে ঘোষণা করা হয়েছে, তাই আপনি এটি পরিবর্তন করতে পারবেন।
ভেরিয়েবল ইনিশিয়ালাইজেশন (Variable Initialization)
ভেরিয়েবল ইনিশিয়ালাইজেশন হচ্ছে একটি ভেরিয়েবলে প্রথমবার মান সেট করা। যখন আপনি ভেরিয়েবল ডিক্লার করেন, তখন সেটি ইনিশিয়ালাইজড হতে হবে। ইনিশিয়ালাইজেশন না করলে, রাস্ট কম্পাইলার একটি ত্রুটি দেখাবে।
ইনিশিয়ালাইজেশন উদাহরণ:
fn main() {
let x: i32 = 5; // ভেরিয়েবল ইনিশিয়ালাইজেশন
println!("x = {}", x);
}এখানে, x ভেরিয়েবলটি i32 টাইপের এবং প্রথমবার মান 5 সেট করা হয়েছে।
টাইপ ইনফারেন্স (Type Inference)
রাস্টে, আপনি যদি টাইপ নির্দিষ্ট না করেন, তবে কম্পাইলার নিজে থেকেই ভেরিয়েবলের টাইপ অনুমান করতে পারে। এটি টাইপ ইনফারেন্স নামে পরিচিত। তবে, এটি শুধুমাত্র সেই পরিস্থিতিতে কার্যকর যেখানে টাইপটি স্পষ্টভাবে নির্ধারণ করা সম্ভব।
উদাহরণ:
fn main() {
let x = 10; // টাইপ ইনফারেন্স, x একটি i32 হবে
println!("x = {}", x);
}এখানে, x ভেরিয়েবলটি i32 টাইপের হবে, কারণ 10 একটি i32 টাইপের মান।
সারাংশ
ভেরিয়েবল ডিক্লারেশন এবং ইনিশিয়ালাইজেশন রাস্টে একটি মৌলিক ধারণা। আপনি যখন একটি ভেরিয়েবল ডিক্লার করেন, তখন এটি টাইপসহ অথবা টাইপ ইনফারেন্সের মাধ্যমে ইনিশিয়ালাইজ করতে পারেন। যদি আপনি চান যে ভেরিয়েবলটি পরিবর্তনযোগ্য হোক, তবে mut কীওয়ার্ড ব্যবহার করতে হবে।
Scalar Data Types (স্কেলার ডেটা টাইপস)
স্কেলার ডেটা টাইপগুলি এমন ডেটা টাইপ যা একক মান ধারণ করতে পারে। অর্থাৎ, এগুলো একক মান বা একটি মাত্র মানের উপস্থাপন করে। রাস্টে স্কেলার ডেটা টাইপগুলি হলো:
১. Integer Types (পূর্ণসংখ্যা টাইপ)
রাস্টে পূর্ণসংখ্যা টাইপগুলি হলো signed এবং unsigned, যেগুলি ভেরিয়েবলগুলোতে পূর্ণসংখ্যা ধারণ করতে সাহায্য করে। প্রতিটি টাইপ নির্দিষ্ট সাইজের (বিটস) হয়ে থাকে।
- signed integers: সাইনযুক্ত পূর্ণসংখ্যা ধারণ করে, যেগুলিতে ধনাত্মক এবং ঋণাত্মক উভয় মান থাকতে পারে।
i8,i16,i32,i64,i128(সর্বোচ্চ 128-বিট পর্যন্ত)
- unsigned integers: সাইনবিহীন পূর্ণসংখ্যা, যার মান সবসময় ধনাত্মক।
u8,u16,u32,u64,u128
উদাহরণ:
let x: i32 = 100; // signed integer
let y: u32 = 200; // unsigned integer২. Floating-point Types (ফ্লোটিং পয়েন্ট টাইপ)
ফ্লোটিং পয়েন্ট টাইপগুলি দশমিক সংখ্যাগুলি ধারণ করে, যেমন 3.14 বা -2.5। রাস্টে দুইটি ফ্লোটিং পয়েন্ট টাইপ আছে:
- f32: 32-বিট ফ্লোটিং পয়েন্ট সংখ্যা
- f64: 64-বিট ফ্লোটিং পয়েন্ট সংখ্যা (ডিফল্ট টাইপ)
উদাহরণ:
let a: f32 = 3.14; // 32-bit floating point number
let b: f64 = 3.14159; // 64-bit floating point number৩. Boolean Type (বুলিয়ান টাইপ)
বুলিয়ান টাইপ শুধু দুটি মান ধারণ করতে পারে, true অথবা false। এটি শর্তমূলক পরীক্ষায় ব্যবহৃত হয়।
bool: একটি বুলিয়ান মান, যার মানtrueবাfalse।
উদাহরণ:
let is_active: bool = true;
let is_completed: bool = false;৪. Character Type (অক্ষর টাইপ)
অক্ষর টাইপটি একটি একক অক্ষর বা চিহ্ন ধারণ করে। এটি সাধারণত একটি ইউনিকোড স্কেলেড অক্ষর হিসেবে কাজ করে।
char: একটি একক অক্ষর ধারণ করে যা ইউনিকোডের মাধ্যমে প্রতিনিধিত্ব করা হয়।
উদাহরণ:
let c: char = 'A'; // character type
let symbol: char = '#'; // another characterCompound Data Types (কম্পাউন্ড ডেটা টাইপস)
কম্পাউন্ড ডেটা টাইপগুলি একাধিক মান ধারণ করতে সক্ষম। এগুলি একাধিক ডেটা টাইপ একত্রে ধারণ করতে পারে এবং গঠনমূলকভাবে ডেটাকে একত্রে রাখে। রাস্টে দুটি প্রধান কম্পাউন্ড ডেটা টাইপ রয়েছে:
১. Tuple (টিউপল)
টিউপল হল একাধিক মান ধারণকারী একটি কম্পাউন্ড ডেটা টাইপ, যেটি বিভিন্ন ধরনের ডেটা টাইপের মান রাখতে পারে। টিউপলের মধ্যে ধার্য করা মানগুলো অপরিবর্তনীয় (immutable) এবং প্রতিটি উপাদান আলাদা টাইপের হতে পারে।
উদাহরণ:
let tup: (i32, f64, char) = (500, 6.4, 'A'); // টিউপলটিউপলের উপাদানগুলোকে অ্যাক্সেস করা যেতে পারে ইনডেক্স ব্যবহার করে:
let (x, y, z) = tup; // Destructuring the tuple
println!("x: {}, y: {}, z: {}", x, y, z); // Accessing elements২. Array (অ্যারে)
অ্যারে হল এক ধরনের কম্পাউন্ড ডেটা টাইপ যা একটি নির্দিষ্ট সাইজের সমজাতীয় (homogeneous) ডেটা ধারণ করে। অ্যারেগুলোতে সব মান এক ধরনের ডেটা টাইপের হতে হয় এবং সেগুলো একটি নির্দিষ্ট সংখ্যক উপাদান ধারণ করতে পারে।
উদাহরণ:
let arr: [i32; 5] = [1, 2, 3, 4, 5]; // অ্যারে
println!("First element: {}", arr[0]); // অ্যারে উপাদান অ্যাক্সেসঅ্যারে ও স্লাইসের মধ্যে প্রধান পার্থক্য হলো অ্যারেগুলির সাইজ নির্দিষ্ট থাকে, কিন্তু স্লাইসগুলির সাইজ পরিবর্তনশীল হতে পারে।
সারাংশ
স্কেলার ডেটা টাইপ একক মান ধারণ করে এবং এগুলো সাধারনত গাণিতিক বা লজিক্যাল মান হয়। এর মধ্যে রয়েছে পূর্ণসংখ্যা (integer), ফ্লোটিং পয়েন্ট (floating-point), বুলিয়ান (boolean) এবং **অক্ষর (character)**।
কম্পাউন্ড ডেটা টাইপ একাধিক মান ধারণ করে এবং এতে একাধিক ধরনের ডেটা টাইপ থাকতে পারে, যেমন টিউপল (tuple), যা বিভিন্ন ডেটা টাইপের উপাদান ধারণ করে, এবং অ্যারে (array), যা এক ধরনের ডেটা টাইপের উপাদান ধারণ করে।
Immutable Variables (ইমিউটেবল ভেরিয়েবলস)
রাস্টে ডিফল্টভাবে ভেরিয়েবলগুলি ইমিউটেবল হয়। এর মানে হল যে, আপনি যখন একটি ভেরিয়েবল ডিফাইন করবেন, তখন তার মান পরবর্তী সময়ে পরিবর্তন করা যাবে না। এই নিরাপত্তা বৈশিষ্ট্যটি মেমোরি সেফটি নিশ্চিত করতে সাহায্য করে, কারণ এটি মিউটেশন বা অপ্রত্যাশিত পরিবর্তন থেকে ডেটাকে সুরক্ষিত রাখে।
ইমিউটেবল ভেরিয়েবল ঘোষণা:
fn main() {
let x = 5; // x is immutable
println!("The value of x is: {}", x);
// Uncommenting the next line will cause an error:
// x = 10; // error: cannot assign twice to immutable variable `x`
}এখানে, ভেরিয়েবল x একটি ইমিউটেবল ভেরিয়েবল হিসাবে ঘোষণা করা হয়েছে, যার মান একবার সেট করার পর পরিবর্তন করা যাবে না। যদি আপনি তার মান পরিবর্তন করার চেষ্টা করেন, তাহলে কম্পাইলার একটি ত্রুটি দেখাবে।
Mutable Variables (মিউটেবল ভেরিয়েবলস)
যদি আপনি চান যে একটি ভেরিয়েবল পরিবর্তনযোগ্য (mutable) হতে পারে, তবে আপনাকে mut কীওয়ার্ড ব্যবহার করতে হবে। মিউটেবল ভেরিয়েবলগুলির মান পরে পরিবর্তন করা যায়, তবে এক্ষেত্রে সতর্ক থাকতে হবে যে, একাধিক থ্রেড যদি সেই ভেরিয়েবল অ্যাক্সেস করে, তবে ডেটা রেস বা অন্যান্য কনকারেন্সি সমস্যার সম্ভাবনা থাকতে পারে।
মিউটেবল ভেরিয়েবল ঘোষণা:
fn main() {
let mut y = 5; // y is mutable
println!("The initial value of y is: {}", y);
y = 10; // Now we can change the value of y
println!("The updated value of y is: {}", y);
}এখানে mut কীওয়ার্ড দিয়ে ভেরিয়েবল y কে মিউটেবল হিসেবে ঘোষণা করা হয়েছে, ফলে আপনি পরে তার মান পরিবর্তন করতে পারবেন।
Immutable এবং Mutable Variables এর মধ্যে পার্থক্য
- Immutable Variables: একবার মান নির্ধারণের পরে তাদের মান পরিবর্তন করা যায় না। এটি কোডের নিরাপত্তা নিশ্চিত করে এবং মেমোরি সেফটি বজায় রাখে।
- Mutable Variables: আপনি যেকোনো সময় তাদের মান পরিবর্তন করতে পারেন, তবে এটি কোডে কিছু সতর্কতা এবং সঠিক ব্যবহার নিশ্চিত করতে পারে।
Borrowing এবং Mutability
রাস্টে borrowing এবং mutability সম্পর্কিত কিছু নিয়ম রয়েছে। যখন আপনি একটি মিউটেবল ভেরিয়েবলকে বোরো করেন, তখন সবার জন্য এটি একযোগে একাধিক মিউটেবল রেফারেন্স থাকতে পারে না। তবে আপনি immutable রেফারেন্স দিয়ে একাধিক জায়গায় ডেটা শেয়ার করতে পারেন, কিন্তু mutable রেফারেন্স থাকলে শুধুমাত্র এক জায়গা থেকেই সেটা অ্যাক্সেস করা যাবে।
fn main() {
let mut x = 5;
let y = &mut x; // mutable reference
*y += 1; // modify the value of x through y
println!("The value of x is: {}", x);
}এখানে, x এর একটি মিউটেবল রেফারেন্স y তে দেওয়া হয়েছে, এবং y এর মাধ্যমে x এর মান পরিবর্তন করা হয়েছে।
সারাংশ
- Immutable Variables: একবার মান দেওয়া হলে পরে পরিবর্তন করা যায় না।
- Mutable Variables: ভেরিয়েবলটি
mutকীওয়ার্ড দিয়ে ঘোষণা করলে তার মান পরিবর্তন করা যায়। - রাস্টের Immutable ভেরিয়েবল ডিফল্ট থাকে, যা কোডকে নিরাপদ এবং রেফারেন্সের মাধ্যমে পারফরম্যান্স উন্নত করতে সাহায্য করে, যখন Mutable ভেরিয়েবল পরিবর্তনযোগ্য ডেটার সাথে কাজ করার জন্য ব্যবহৃত হয়।
Shadowing (শ্যাডোইং)
রাস্টে Shadowing এমন একটি বৈশিষ্ট্য যেখানে একটি ভেরিয়েবল একই নামের অন্য একটি ভেরিয়েবল দ্বারা আচ্ছাদিত (shadowed) হয়ে যায়। এতে পুরানো ভেরিয়েবলটি ওভাররাইড হয়ে যায় এবং নতুন ভেরিয়েবল তৈরি করা হয়। এটি ভেরিয়েবলের টাইপ পরিবর্তন করতে সাহায্য করে, যার ফলে ভেরিয়েবলটি অন্য টাইপের মান ধারণ করতে পারে।
Shadowing এর মূল সুবিধা:
- টাইপ পরিবর্তন: আপনি একটি ভেরিয়েবলের মানের টাইপ পরিবর্তন করতে পারেন।
- নতুন ভেরিয়েবল তৈরি: আপনি একে অপরকে ভেরিয়েবল নামের সাহায্যে পুনরায় ব্যবহার করতে পারেন, যা কোডে ক্লিনলিনেস এবং পরিষ্কারতা আনে।
উদাহরণ:
fn main() {
let x = 5; // প্রথম x ভেরিয়েবল
println!("The value of x is: {}", x); // ৫
let x = x + 1; // নতুন x ভেরিয়েবল
println!("The value of x is: {}", x); // ৬
let x = "Hello, Rust!"; // আবার নতুন টাইপে x ভেরিয়েবল
println!("The value of x is: {}", x); // Hello, Rust!
}ব্যাখ্যা:
- প্রথমে,
xভেরিয়েবলটি একটি পূর্ণসংখ্যা (5) ধারণ করে। - পরে,
xএর মান বৃদ্ধি করা হয় এবং আবারx-এর মান পরিবর্তিত হয়ে যায়। - তারপর,
xআবার একটি স্ট্রিং ধারণ করতে পারে।
এখানে, x একটি নতুন টাইপ গ্রহণ করেছে এবং পুরনো x ভেরিয়েবলটি "shadow" হয়ে গেছে, তাই আমরা শ্যাডোইং ব্যবহার করছি।
Constants (ধ্রুবক)
রাস্টে Constants হল এমন মান যা একবার নির্ধারণের পর আর পরিবর্তন করা যায় না। ধ্রুবক সাধারণত সব জায়গায় ব্যবহার করা হয়, যেমন গণনা বা ফিক্সড মান যা প্রোগ্রামটি চলাকালীন সময়ে অপরিবর্তিত থাকে। ধ্রুবক একটি নির্দিষ্ট টাইপের হতে হবে এবং এগুলি সর্বদা বড় হাতের অক্ষরে (uppercase) লেখা হয়।
Constants এর প্রধান বৈশিষ্ট্য:
- Type Annotation (টাইপ অ্যানোটেশন): একটি ধ্রুবকের অবশ্যই টাইপ উল্লেখ করতে হবে।
- Global Scope: Constants গ্লোবাল স্কোপে ব্যবহার করা যেতে পারে এবং এগুলি কার্যকরীভাবে যেকোনো জায়গায় অ্যাক্সেস করা যায়।
উদাহরণ:
const MAX_POINTS: i32 = 100_000;
const PI: f64 = 3.14159;
fn main() {
println!("The maximum points are: {}", MAX_POINTS);
println!("The value of pi is: {}", PI);
}ব্যাখ্যা:
এখানে, MAX_POINTS এবং PI দুটি ধ্রুবক, যেগুলির মান প্রোগ্রাম চলাকালীন সময়ে অপরিবর্তিত থাকে।
MAX_POINTSএকটি পূর্ণসংখ্যা (i32) যা 100,000।PIএকটি ভাসমান সংখ্যা (f64) যা 3.14159।
এগুলি কোথাও পরিবর্তিত হতে পারে না, এবং এগুলি গ্লোবাল স্কোপে ব্যবহারযোগ্য।
Shadowing এবং Constants এর মধ্যে পার্থক্য
- Shadowing একটি ভেরিয়েবল বা মানকে অন্য একটি মান বা টাইপ দ্বারা আচ্ছাদিত করে, তবে এটি local scope-এ ঘটে এবং টাইপ পরিবর্তন করা যায়।
- Constants হল অপরিবর্তিত মান, যা সাধারণত প্রোগ্রাম জুড়ে একাধিক জায়গায় ব্যবহার করা হয় এবং এর global scope থাকে।
সারাংশ
রাস্টে Shadowing এবং Constants দুটি গুরুত্বপূর্ণ বৈশিষ্ট্য যা কোডের মান পরিচালনা এবং প্রোগ্রামের পোর্টেবিলিটি এবং সঠিকতা নিশ্চিত করতে সাহায্য করে।
- Shadowing ভেরিয়েবলগুলির মান পরিবর্তন করতে সহায়ক, যখন Constants গ্লোবালভাবে অপরিবর্তিত মান ধারণ করতে ব্যবহৃত হয়।
- এদের সাহায্যে কোডের পঠনযোগ্যতা, কার্যকারিতা এবং সুরক্ষা বৃদ্ধি পায়।
Read more