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

জীবনকাল এবং রেফারেন্স

মরিচা-এ, প্রতিটি রেফারেন্সের একটি জীবনকাল থাকে, যা সেই রেফারেন্সের বৈধতার সুযোগের সাথে মিলে যায়। বেশিরভাগ সময়, জীবনকাল অন্তর্নিহিত এবং কম্পাইলার দ্বারা অনুমান করা হয় জীবনকালের নির্জন নিয়মের জন্য ধন্যবাদ। যাইহোক, যখন বিভিন্ন রেফারেন্সের জীবনকালের মধ্যে সম্পর্ক অস্পষ্ট হয়, তখন আমাদের অবশ্যই তাদের স্পষ্টভাবে টীকা দিতে হবে।

জীবনকালের মূল উদ্দেশ্য হল ঝুলে থাকা রেফারেন্স প্রতিরোধ করা (এমন তথ্যের রেফারেন্স যা ইতিমধ্যেই মেমরি থেকে সরিয়ে ফেলা হয়েছে)।


লাইফটাইম টীকা সিনট্যাক্স

লাইফটাইম নামগুলি একটি অ্যাপোস্ট্রফি (') দিয়ে শুরু হয় এবং সাধারণত ছোট হাতের অক্ষর হয় (যেমন 'a)। লাইফটাইম টীকাগুলি ভেরিয়েবলের প্রকৃত জীবনকাল পরিবর্তন করে না, তবে তারা কম্পাইলারকে ইনপুট এবং আউটপুটগুলির বৈধতার মধ্যে সম্পর্ক নির্দেশ করে।

উদাহরণস্বরূপ, যদি একটি ফাংশন দুটি স্ট্রিং রেফারেন্স প্যারামিটার নেয় এবং একটি স্ট্রিং রেফারেন্স প্রদান করে এবং আমরা চাই যে প্রত্যাবর্তিত রেফারেন্সটি বৈধ হোক যতক্ষণ না উভয় ইনপুট পরামিতি বৈধ থাকে, আমরা ব্যবহার করি:

Rust
fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
    if x.len() > y.len() {
        x
    } else {
        y
    }
}

ডেটা স্ট্রাকচারে জীবনকাল

যদি একটি কাঠামোতে একটি রেফারেন্স একটি ক্ষেত্র থাকে, তাহলে আমাদের অবশ্যই স্পষ্টভাবে সেই রেফারেন্সে লাইফটাইম টীকা করতে হবে যাতে স্ট্রাকট ইনস্ট্যান্সটি উল্লেখ করা ডেটার বাইরে থাকতে পারে না:

Rust
struct ImportantExcerpt<'a> {
    part: &'a str,
}

fn main() {
    let novel = String::from("Call me Ishmael. Some years ago...");
    let first_sentence = novel.split('.').next().unwrap();
    let i = ImportantExcerpt {
        part: first_sentence,
    };
}

স্ট্যাটিক লাইফটাইম

'static জীবনকাল হল একটি বিশেষ জীবনকাল যা প্রোগ্রামের সম্পূর্ণ সময়কাল ধরে চলে। সমস্ত স্ট্রিং লিটারেলের (&str) অন্তর্নিহিতভাবে একটি 'static জীবনকাল থাকে কারণ সেগুলি সরাসরি বাইনারি এক্সিকিউটেবলের ভিতরে সংরক্ষিত থাকে।

Rust
let s: &'static str = "I have a static lifetime.";

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

ব্যায়াম 1: দীর্ঘতম ফাংশন

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

longest<'a> নামে একটি ফাংশন লিখুন যা দুটি পরামিতি গ্রহণ করে, x প্রকার &'a str এবং y প্রকার &'a str, এবং &'a str প্রকারের একটি মান প্রদান করে। ফাংশনের ভিতরে, একটি if/else ব্লক ব্যবহার করুন যদি x এর দৈর্ঘ্য y এর থেকে বেশি হয়, অন্যথায় y প্রদান করুন।

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

`fn longest<'a>(x: &'a str, y: &'a str) -> &'a str`দিয়ে স্বাক্ষর ঘোষণা করুন। তারপর`if x.len() > y.len() { x } else { y }` ব্যবহার করুন।

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

অনুশীলনী 2: রেফারেন্স সহ কাঠামো

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

Excerpt<'a> নামের একটি কাঠামো সংজ্ঞায়িত করুন যেখানে একটি একক ক্ষেত্র রয়েছে যার নাম টাইপ &'a str এর অংশ। প্রধান ফাংশনে, টেক্সট নামে একটি স্ট্রিং ভেরিয়েবল তৈরি করুন এবং টেক্সটের একটি রেফারেন্স ধার করে Excerpt টাইপের একটি পরিবর্তনশীল উদ্ধৃতি ইনস্ট্যান্টিয়েট করুন। প্রিন্ট excerpt.part.

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

`struct Excerpt<'a> { part: &'a str }`ব্যবহার করুন। প্রধানত এটিকে`Excerpt { part: &text }` দিয়ে ইনস্ট্যান্টিয়েট করুন।

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

অনুশীলনী 3: স্ট্যাটিক রেফারেন্স

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

স্ট্যাটিক লাইফটাইমের (&'static str) জন্য একটি স্পষ্ট টাইপ টীকা সহ একটি পরিবর্তনশীল নামের বার্তা ঘোষণা করুন, এটিকে একটি স্ট্রিং আক্ষরিক বরাদ্দ করুন। বার্তার মান প্রিন্ট করুন।

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

স্থির জীবনকাল স্পষ্টভাবে টীকা করতে সিনট্যাক্স `লেট মেসেজ: &'static str = 'Messaggio statico!';` ব্যবহার করুন।

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