Closures এবং Higher-Order Functions

Functions এবং Methods (ফাংশন এবং মেথডস) - রাস্ট (Rust) - Computer Programming

313

Closures (ক্লোজার)

রাস্টে Closures হল এমন ফাংশন যেগুলি তাদের চারপাশের পরিবেশ (environment) থেকে ভ্যালু বা ভেরিয়েবল ক্যাপচার করতে সক্ষম। এটি অন্য ফাংশন বা স্কোপের মধ্যে থাকা ভেরিয়েবলগুলিকে অন্তর্ভুক্ত করতে পারে এবং সেগুলিকে নিজেদের মধ্যে ব্যবহার করতে পারে।

ক্লোজারের মূল বৈশিষ্ট্য:

  • ক্লোজার একটি ফাংশন এবং সেই ফাংশনের বাইরের স্কোপের ভেরিয়েবলগুলির মধ্যে সম্পর্ক তৈরি করে।
  • ক্লোজার তাদের বাইরের ভেরিয়েবলগুলিকে borrow বা move করতে পারে।
  • ক্লোজার সাধারণত ফাংশন আর্গুমেন্ট হিসেবে ব্যবহৃত হয় এবং তাদের নিজস্ব স্টেট রাখতে পারে।

ক্লোজারের সিনট্যাক্স:

রাস্টে ক্লোজার ডিফাইন করার জন্য সাধারণত |parameters| expression সিনট্যাক্স ব্যবহার করা হয়।

উদাহরণ:

fn main() {
    let add = |a, b| a + b; // ক্লোজার যা দুইটি প্যারামিটার নেয় এবং তাদের যোগফল দেয়
    let result = add(5, 10);
    println!("Result: {}", result);
}

এখানে add হল একটি ক্লোজার যা দুইটি আর্গুমেন্ট নিয়ে তাদের যোগফল রিটার্ন করে। ক্লোজারটি |a, b| a + b আকারে সংজ্ঞায়িত হয়েছে, যেখানে a এবং b প্যারামিটার এবং a + b হল আউটপুট এক্সপ্রেশন।

ক্লোজার এবং সিস্টেমের স্টেট:

রাস্টে ক্লোজারের প্রধান সুবিধা হলো এটি তাদের বাইরের স্কোপ থেকে ভেরিয়েবল borrow করতে পারে অথবা সেগুলি move করতে পারে।

উদাহরণ (borrow):

fn main() {
    let x = 5;
    let print_x = || println!("x is {}", x); // borrow the value of x
    print_x(); // "x is 5"
}

এখানে x ক্লোজার দ্বারা borrow করা হয়েছে, এবং এটি ক্লোজারের মধ্যে ব্যবহৃত হয়েছে।

উদাহরণ (move):

fn main() {
    let x = vec![1, 2, 3];
    let take_ownership = move || println!("x is {:?}", x); // move x into the closure
    take_ownership(); // "x is [1, 2, 3]"
}

এখানে x ক্লোজারে move করা হয়েছে, অর্থাৎ এটি আর বাইরের স্কোপে অ্যাক্সেসযোগ্য নয়।


Higher-Order Functions (হায়ার-অর্ডার ফাংশন)

Higher-Order Functions হল এমন ফাংশন যা অন্য ফাংশনকে আর্গুমেন্ট হিসেবে গ্রহণ করতে পারে অথবা একটি ফাংশন রিটার্ন করতে পারে। এই ধরনের ফাংশন আমাদের কোড আরও আবস্ট্রাক্ট এবং রিইউজেবল করে তোলে।

হায়ার-অর্ডার ফাংশনের বৈশিষ্ট্য:

  • একটি হায়ার-অর্ডার ফাংশন অন্য একটি ফাংশনকে আর্গুমেন্ট হিসেবে গ্রহণ করতে পারে।
  • এটি একটি ফাংশন রিটার্নও করতে পারে।

উদাহরণ:

fn apply<F>(f: F) 
where
    F: Fn() -> i32,
{
    println!("Result: {}", f());
}

fn main() {
    let x = || 5; // ক্লোজার যে ৫ রিটার্ন করে
    apply(x); // apply ফাংশনকে x ক্লোজার আর্গুমেন্ট হিসেবে প্রদান
}

এখানে apply একটি হায়ার-অর্ডার ফাংশন যা একটি ক্লোজার বা ফাংশনকে আর্গুমেন্ট হিসেবে গ্রহণ করছে এবং সেটি f() কল করে রিটার্ন ভ্যালু প্রদর্শন করছে।

আরও উদাহরণ:

fn add_one(x: i32) -> i32 {
    x + 1
}

fn apply_fn<F>(f: F, value: i32) -> i32 
where
    F: Fn(i32) -> i32,
{
    f(value)
}

fn main() {
    let result = apply_fn(add_one, 5); // add_one ফাংশনকে apply_fn এ আর্গুমেন্ট হিসেবে দেয়া
    println!("Result: {}", result); // Output: 6
}

এখানে apply_fn একটি হায়ার-অর্ডার ফাংশন যা add_one ফাংশনটিকে আর্গুমেন্ট হিসেবে গ্রহণ করছে এবং তাকে প্রয়োগ করে ফলাফল রিটার্ন করছে।


Closures এবং Higher-Order Functions এর মধ্যে সম্পর্ক

ক্লোজার এবং হায়ার-অর্ডার ফাংশন একে অপরের সাথে ঘনিষ্ঠভাবে সম্পর্কিত। ক্লোজারগুলো সাধারণত হায়ার-অর্ডার ফাংশনের আর্গুমেন্ট হিসেবে ব্যবহৃত হয়, এবং হায়ার-অর্ডার ফাংশন ক্লোজারগুলিকে সিস্টেমের ভেরিয়েবলগুলির সাথে ব্যবহার করতে সাহায্য করে।

উদাহরণ:

fn apply_closure<F>(f: F)
where
    F: Fn(),
{
    f();
}

fn main() {
    let closure = || println!("Hello from closure!"); // ক্লোজার
    apply_closure(closure); // হায়ার-অর্ডার ফাংশনে ক্লোজার পাস করা
}

এখানে apply_closure একটি হায়ার-অর্ডার ফাংশন যা একটি ক্লোজার আর্গুমেন্ট হিসেবে গ্রহণ করছে এবং সেটি কল করে।


সারাংশ

  • Closures হল এমন ফাংশন যা বাইরের স্কোপের ভেরিয়েবলগুলিকে borrow বা move করতে পারে, যা কোডের পুনঃব্যবহারযোগ্যতা এবং কোডকে আরো কমপ্যাক্ট করে তোলে।
  • Higher-Order Functions হল এমন ফাংশন যা অন্য ফাংশন বা ক্লোজারকে আর্গুমেন্ট হিসেবে গ্রহণ করতে পারে অথবা একটি ফাংশন রিটার্ন করতে পারে, এবং এটি আমাদের কোডের অবস্ট্রাকশন এবং পুনঃব্যবহারযোগ্যতা বৃদ্ধি করে।

রাস্টে ক্লোজার এবং হায়ার-অর্ডার ফাংশন প্রোগ্রামিংয়ের ক্ষমতা এবং সৌন্দর্য বাড়ায়, কারণ এগুলি কোডকে আরও পরিষ্কার এবং ম্যানেজেবল করে তোলে।

Content added By
Promotion

Are you sure to start over?

Loading...