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

জেনেরিক এবং ফাংশন

জেনারিকস আপনাকে নমনীয়, পুনঃব্যবহারযোগ্য কোড লিখতে দেয়, বিভিন্ন ধরনের ডেটার জন্য যুক্তির নকল এড়িয়ে যায়। বিভিন্ন ধরনের (যেমন i32, f64, বা String) জন্য একাধিক ফাংশন বা কাঠামো সংজ্ঞায়িত করার পরিবর্তে, আমরা একটি জেনেরিক টাইপ প্যারামিটার ব্যবহার করতে পারি, যা প্রচলিতভাবে T অক্ষর দ্বারা উপস্থাপিত হয়।

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


জেনেরিক ফাংশন

একটি জেনেরিক ফাংশন সংজ্ঞায়িত করতে, আমরা ফাংশনের নামের ঠিক পরে এবং আর্গুমেন্ট তালিকার আগে টাইপ প্যারামিটার <T> সন্নিবেশ করি:

Rust
fn print_value<T: std::fmt::Debug>(value: T) {
    println!("Value: {:?}", value);
}

জেনেরিক ফাংশনে, আমরা আর্গুমেন্ট প্রকার এবং রিটার্ন টাইপ উভয়ের জন্য জেনেরিক টাইপ T ব্যবহার করতে পারি:

Rust
fn identity<T>(value: T) -> T {
    value
}

সাধারণ কাঠামো

আমরা নমনীয় ক্ষেত্রগুলিকে সংজ্ঞায়িত করতে কাঠামোর (struct) ভিতরে জেনেরিক টাইপ প্যারামিটারগুলিও ব্যবহার করতে পারি:

Rust
struct KeyValuePair<K, V> {
    key: K,
    value: V,
}

fn main() {
    let pair = KeyValuePair {
        key: String::from("age"),
        value: 30,
    };
}

একটি জেনেরিক স্ট্রাকচারের জন্য একটি impl ব্লকে, আমরা একটি জেনেরিক কাঠামোতে পদ্ধতি প্রয়োগ করছি তা নির্দেশ করার জন্য impl কীওয়ার্ডের পরপরই আমাদের টাইপ প্যারামিটার <T> ঘোষণা করতে হবে:

Rust
struct Container<T> {
    value: T,
}

impl<T> Container<T> {
    fn new(value: T) -> Self {
        Container { value }
    }

    fn value(&self) -> &T {
        &self.value
    }
}

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

ব্যায়াম 1: পয়েন্ট স্ট্রাকট

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

Point<T> নামের একটি জেনেরিক স্ট্রাকটকে দুটি ক্ষেত্র সহ সংজ্ঞায়িত করুন: x টাইপ T এবং T টাইপের y। প্রধান ফাংশনে, পূর্ণসংখ্যার মান x = 5 এবং y = 10 সহ একটি বিন্দু সমন্বিত একটি ভেরিয়েবল পয়েন্ট ইনস্ট্যান্টিয়েট করুন, তারপর পয়েন্ট.x এর মান প্রিন্ট করুন।

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

`struct Point<T> { x: T, y: T }`ব্যবহার করে struct ঘোষণা করুন। এটিকে প্রধানভাবে ইনস্ট্যান্টিয়েট করুন এবং এটি প্রিন্ট করতে`point.x` ব্যবহার করুন।

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

ব্যায়াম 2: অদলবদল সহ একটি Tuple বিপরীত করা

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

swap<T> নামে একটি জেনেরিক ফাংশন লিখুন যা দুটি উপাদানের একটি টিপল (T, T) গ্রহণ করে এবং তাদের অবস্থান বিপরীত করে একটি নতুন টিপল (T, T) প্রদান করে। প্রধান ফাংশনে, টিপল (1, 2) দিয়ে ফাংশনটি কল করুন এবং ফলাফলটি প্রিন্ট করুন।

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

ফাংশন স্বাক্ষর অবশ্যই `fn swap<T>(জোড়া: (T, T)) -> (T, T)`হতে হবে। বিপরীত টিপলকে`(pair.1, pair.0)` দিয়ে ফিরিয়ে দিন।

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

ব্যায়াম 3: ধারক কাঠামো

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

একটি জেনেরিক স্ট্রাকট কনটেইনার<T> সংজ্ঞায়িত করুন T টাইপের একটি মান ক্ষেত্র ধারণকারী। একটি নতুন পদ্ধতি সংজ্ঞায়িত করতে একটি জেনেরিক ইমপ্লিক ব্লক প্রয়োগ করুন যা T টাইপের একটি মান গ্রহণ করে এবং Container<T> এর একটি উদাহরণ প্রদান করে।

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

ব্যবহার করুন `impl<T> কন্টেইনার<T>`সংশ্লিষ্ট পদ্ধতি বাস্তবায়ন করতে `fn new(value: T) -> Self { Container { value } }`।

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