Borrowing এবং References এর ব্যবহার

Ownership এবং Borrowing (অনারশিপ এবং বোরোইং) - রাস্ট (Rust) - Computer Programming

243

Borrowing এবং References কী?

রাস্টের সবচেয়ে গুরুত্বপূর্ণ বৈশিষ্ট্যগুলোর মধ্যে Borrowing এবং References অন্তর্ভুক্ত। এটি মেমোরি সেফটি নিশ্চিত করতে সাহায্য করে, যাতে আপনি ডেটার মালিকানা ছাড়া সেই ডেটা ব্যবহার করতে পারেন।

Borrowing হল সেই প্রক্রিয়া যেখানে আপনি কোনো ভেরিয়েবলের ডেটা ঋণ (borrow) নেন, কিন্তু তার মালিকানা পরিবর্তন না করে। রাস্টের মালিকানা মডেল অনুযায়ী, ডেটার একাধিক রেফারেন্স থাকতে পারে, তবে একটি সময়ের জন্য সেই ডেটার মালিকানা শুধু একটি জায়গার হাতে থাকতে পারে।

References:

রাস্টে রেফারেন্স হল একটি ভেরিয়েবলের স্মৃতি অবস্থানের প্রতি নির্দেশিকা (pointer), যা ডেটার মালিকানা ছাড়া সেই ডেটায় অ্যাক্সেস প্রদান করে। রেফারেন্স দুটি ধরনের হতে পারে:

  • Immutable Reference (ইমিউটেবল রেফারেন্স): যেখানে আপনি ডেটা দেখতে পারেন, তবে সেটি পরিবর্তন করতে পারবেন না।
  • Mutable Reference (মিউটেবল রেফারেন্স): যেখানে আপনি ডেটা দেখতে এবং সেটি পরিবর্তন করতে পারবেন।

Immutable Borrowing (ইমিউটেবল বোরোউ):

এটি তখন ব্যবহৃত হয় যখন আপনি ডেটার কেবলমাত্র রিড (পড়তে) সক্ষম হতে চান, কিন্তু সেই ডেটা পরিবর্তন করতে পারবেন না। এটি রাস্টের সবচেয়ে সাধারণ রেফারেন্স টাইপ।

উদাহরণ:

fn main() {
    let s = String::from("Hello, World!");
    let s_ref = &s; // Immutable reference to s

    println!("{}", s_ref); // We can read the value, but cannot modify it
}

এখানে, s_ref একটি immutable reference যা s এর দিকে নির্দেশ করে। আপনি s_ref দিয়ে কেবল ডেটা পড়তে পারবেন, কিন্তু s এর মান পরিবর্তন করতে পারবেন না।

Mutable Borrowing (মিউটেবল বোরোউ):

এটি তখন ব্যবহৃত হয় যখন আপনি ডেটাকে পরিবর্তন করতে চান, তবে তার মালিকানা ছাড়া। মিউটেবল রেফারেন্স এর মাধ্যমে আপনি ডেটার মান পরিবর্তন করতে পারবেন।

উদাহরণ:

fn main() {
    let mut s = String::from("Hello");
    let s_ref = &mut s; // Mutable reference to s

    s_ref.push_str(", World!"); // We can modify s through s_ref
    println!("{}", s_ref);
}

এখানে, s_ref একটি mutable reference যা s এর দিকে নির্দেশ করে, এবং আমরা push_str এর মাধ্যমে s এর মান পরিবর্তন করেছি।

একে-অন্যের সাথে একযোগিতার বিধি (The Rules for Borrowing):

রাস্টে রেফারেন্স এবং বোরোউ এর কিছু গুরুত্বপূর্ণ নিয়ম রয়েছে:

  1. এমনকি একাধিক immutable references থাকতে পারে, তবে একই সময়ে একটি mutable reference থাকতে পারে না। যদি আপনি mutable reference ব্যবহার করেন, তাহলে অন্য কোনো অংশ থেকে ওই ডেটার immutable reference গ্রহণ করা যাবে না।
  2. একটি mutable reference থাকতে পারে, তবে সেই সময়ে অন্য কোনো অংশ থেকে অন্য কোনো mutable reference থাকতে পারবে না।

উদাহরণ (অবৈধ):

fn main() {
    let mut s = String::from("Hello");
    let s_ref1 = &mut s; // First mutable reference
    let s_ref2 = &mut s; // Second mutable reference (ERROR)

    println!("{}", s_ref1);
    println!("{}", s_ref2); // This will give an error due to mutable references
}

এখানে দ্বিতীয় mutable reference নেওয়া যাবে না, কারণ রাস্টের নিয়ম অনুযায়ী, একই সময়ে একাধিক mutable references নেওয়া যাবে না।

Return a Reference (রেফারেন্স রিটার্ন করা):

কখনও কখনও, আপনি একটি ফাংশন থেকে একটি রেফারেন্স রিটার্ন করতে চান। তবে এর ক্ষেত্রে, রাস্ট আপনাকে নিশ্চিত করতে বলবে যে রিটার্ন করা রেফারেন্স ফাংশনের কলারের জীবিত অবস্থায় থাকতে হবে।

উদাহরণ:

fn main() {
    let s = String::from("Hello, World!");
    let s_ref = get_reference(&s);

    println!("{}", s_ref);
}

fn get_reference(s: &String) -> &String {
    s // Return reference to s
}

এখানে, get_reference ফাংশন একটি immutable reference রিটার্ন করছে। এই ফাংশনটি শুধুমাত্র তখনই বৈধ হবে যদি s জীবিত থাকে।

সম্ভাব্য ব্যবহার:

  1. ঋণ (Borrowing) ব্যবহারে মেমোরি ব্যবস্থাপনা সহজ হয়: আপনি ডেটার মালিকানা না নিয়ে অন্য জায়গায় ব্যবহার করতে পারেন, ফলে মেমোরি ব্যবস্থাপনা আরও কার্যকর হয়।
  2. রেফারেন্স এবং বোরোউ ব্যবহার কম্পাইল টাইমে ত্রুটি ধরতে সাহায্য করে: এটি রানটাইমের সমস্যা এড়াতে সহায়ক, যেমন ডেটা রেস এবং মেমোরি লিক।
  3. কনকারেন্সি (Concurrency): যখন একাধিক থ্রেড একযোগে কাজ করে, তখন বোরোউ সিস্টেম ডেটা শেয়ার করার ক্ষেত্রে সুরক্ষা নিশ্চিত করে।

সারাংশ

রাস্টের Borrowing এবং References এর ব্যবহার মেমোরি সেফটি এবং ডেটা শেয়ারিংয়ের জন্য অত্যন্ত গুরুত্বপূর্ণ। এগুলো ডেটার মালিকানা ছাড়া সুরক্ষিতভাবে ডেটা ব্যবহারের সুযোগ দেয়, যা ডেটা রেস এবং মেমোরি লিক এড়াতে সহায়তা করে। Immutable এবং Mutable references এর মাধ্যমে কোড লেখার সময় আপনি পারফরম্যান্স এবং নিরাপত্তার মধ্যে সঠিক ভারসাম্য বজায় রাখতে পারেন।

Content added By
Promotion

Are you sure to start over?

Loading...