মূল কন্টেন্টে যান
মডিউল 3 · 2-এর পাঠ 2কোর্সে 6/14~15 min
মডিউল পাঠ (2/2)

রেফারেন্স এবং ধার করা

মরিচা-এ, মালিকানাকে সামনে পিছনে ফাংশনের কাছে দেওয়া ক্লান্তিকর হতে পারে। এটি সমাধান করতে, মরিচা রেফারেন্স (&) ব্যবহার করে।

একটি মানের রেফারেন্স তৈরি করাকে বলা হয় ধার করা।

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

& চিহ্নের সাথে প্রকার বা ভেরিয়েবলের উপসর্গ দিয়ে একটি রেফারেন্স ঘোষণা করা হয়। ডিফল্টরূপে, রেফারেন্স অপরিবর্তনীয়: তারা মান পড়ার অনুমতি দেয় কিন্তু পরিবর্তন না করে।

Rust
fn main() {
    let s1 = String::from("hello");

    // We pass a reference to s1, not ownership
    let len = calculate_length(&s1);

    // s1 is still usable here!
    println!("The length of '{}' is {}.", s1, len);
}

fn calculate_length(s: &String) -> usize { // s is a reference to a String
    s.len()
} // Here, s goes out of scope, but since it doesn't own the value, nothing happens

পরিবর্তনযোগ্য রেফারেন্স

আপনি যদি একটি ধার করা মান পরিবর্তন করতে চান, তাহলে আপনাকে অবশ্যই &mut এর সাথে একটি পরিবর্তনযোগ্য রেফারেন্স ব্যবহার করতে হবে। আসল ভেরিয়েবলটিকে অবশ্যই mut এর সাথে পরিবর্তনযোগ্য ঘোষণা করতে হবে:

Rust
fn main() {
    let mut s = String::from("hello");

    // We pass a mutable reference
    change(&mut s);

    println!("{}", s); // Prints "hello, world"
}

fn change(some_string: &mut String) {
    some_string.push_str(", world");
}

ঋণ নেওয়ার নিয়ম

কম্পাইল-টাইমে মেমরি দুর্নীতি এবং ডেটা রেস প্রতিরোধ করতে, মরিচা দুটি মৌলিক নিয়ম প্রয়োগ করে:

  1. আপনি একই সময়ে একটি মানের যেকোন সংখ্যক অপরিবর্তনীয় রেফারেন্স (&T) থাকতে পারেন। ২।

আপনি একই সুযোগে একই মানের জন্য অপরিবর্তনীয় এবং পরিবর্তনযোগ্য রেফারেন্সগুলিকে একেবারে মিশ্রিত করতে পারবেন না:

Rust
let mut s = String::from("hello");

let r1 = &s; // Valid
let r2 = &s; // Valid
// let r3 = &mut s; // COMPILATION ERROR! You cannot create &mut s if s is already borrowed as immutable

রেফারেন্স স্কোপ এবং নন-লেক্সিকাল লাইফটাইমস (NLL)

ঐতিহাসিকভাবে, একটি রেফারেন্সের সুযোগ যে ব্লকে এটি তৈরি করা হয়েছিল তার শেষ পর্যন্ত স্থায়ী ছিল। আজ, রাস্টের কম্পাইলার নন-লেক্সিকাল লাইফটাইমস (এনএলএল)-এর জন্য আরও স্মার্ট ধন্যবাদ: একটি রেফারেন্সের সুযোগ শেষ লাইনে শেষ হয় যেটি আসলে ব্যবহৃত হয়, অগত্যা ব্লকের শেষে নয়।

এটি নিম্নলিখিত কোডটিকে পুরোপুরি বৈধ করে তোলে:

Rust
let mut s = String::from("hello");
let r1 = &s;
let r2 = &s;
println!("{} and {}", r1, r2); // Last use of r1 and r2. The immutable references expire here!

let r3 = &mut s; // Valid! No active immutable references exist at this point

নিজে চেষ্টা করে দেখুন

ব্যায়াম#rust.m3.l2.e1
প্রচেষ্টা: 0লোড হচ্ছে...

& চিহ্ন ব্যবহার করে calculate_length ফাংশনে s1 এর একটি অপরিবর্তনীয় রেফারেন্স পাস করুন।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

স্ট্রিংটিতে একটি অপরিবর্তনীয় রেফারেন্স পাস করতে `/* TODO \_/`এর সাথে`&s1` প্রতিস্থাপন করুন।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

ব্যায়াম#rust.m3.l2.e2
প্রচেষ্টা: 0লোড হচ্ছে...

পরিবর্তনশীল s পরিবর্তনযোগ্য করুন ( mut s দিন) এবং স্ট্রিং সংশোধন করার অনুমতি দেওয়ার জন্য পরিবর্তন ফাংশনে একটি পরিবর্তনযোগ্য রেফারেন্স (&mut s) পাস করুন।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

`let s` এবং call`change(&mut s);`-এর পরিবর্তে `let mut s` ব্যবহার করুন।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

ব্যায়াম#rust.m3.l2.e3
প্রচেষ্টা: 0লোড হচ্ছে...

Declare a variable s containing String::from("Rust"). Create two distinct immutable references r1 and r2 to s, and finally print both references separated by a space using the println! macro.

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

Assign `let r1 = &s;` and `let r2 = &s;` to obtain two immutable references, then print them with `println!("{} {}", r1, r2);`.

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ