Skill

Control Flow (কন্ট্রোল ফ্লো)

রাস্ট (Rust) - Computer Programming

425

কন্ট্রোল ফ্লো (Control Flow) একটি প্রোগ্রামের সেই অংশ যা নির্দেশ করে কিভাবে কোডের বিভিন্ন অংশ একে অপরের সাথে সম্পর্কিত এবং কোন আদেশ কখন কার্যকর হবে। রাস্টে, কন্ট্রোল ফ্লো সাধারণত শর্তযুক্ত বিবৃতি, লুপ, এবং ফাংশন কলের মাধ্যমে পরিচালিত হয়। কন্ট্রোল ফ্লো ব্যবহারের মাধ্যমে প্রোগ্রামটির কার্যক্রমে পরিবর্তন আনা হয় এবং এটি নির্ধারণ করে কোন অংশ আগে বা পরে কার্যকর হবে।


কন্ট্রোল ফ্লোর মূল উপাদানসমূহ:

রাস্টে কন্ট্রোল ফ্লো ব্যবহারের প্রধান উপাদানগুলো হল:

  1. if/else শর্ত (Conditional Statements)
  2. loop (লুপ)
  3. while loop (হোয়াইল লুপ)
  4. for loop (ফর লুপ)
  5. match (ম্যাচ)
  6. return (রিটার্ন)

১. if/else শর্ত (Conditional Statements)

if এবং else শর্ত ব্যবহার করে বিভিন্ন কোডের অংশ কার্যকর করা যায় শর্তের উপর ভিত্তি করে। শর্তটি সঠিক হলে একটি অংশ কার্যকর হবে এবং অন্যথায় অন্য অংশটি কার্যকর হবে।

উদাহরণ:

fn main() {
    let number = 10;

    if number > 5 {
        println!("The number is greater than 5");
    } else {
        println!("The number is less than or equal to 5");
    }
}

এখানে, যদি number ৫ এর বেশি হয়, তবে প্রথম ব্লক কার্যকর হবে, অন্যথায় দ্বিতীয় ব্লক কার্যকর হবে।


২. loop (লুপ)

loop একটি ইনফিনিট লুপ তৈরি করে, যা চলতে থাকে যতক্ষণ না তাকে explicitly বন্ধ করা হয়। এটি সাধারণত break এবং continue এর মাধ্যমে নিয়ন্ত্রিত হয়।

উদাহরণ:

fn main() {
    let mut count = 0;

    loop {
        count += 1;
        if count == 5 {
            break; // লুপ বন্ধ করা হবে
        }
        println!("Count: {}", count);
    }
}

এই উদাহরণে, লুপটি চলতে থাকবে যতক্ষণ না count ৫ হয়, তারপর break স্টেটমেন্টটি লুপ বন্ধ করবে।


৩. while loop (হোয়াইল লুপ)

while লুপ একটি শর্তের উপর ভিত্তি করে চলতে থাকে। এটি যখন শর্তটি মিথ্যা হয় তখন থেমে যায়।

উদাহরণ:

fn main() {
    let mut count = 0;

    while count < 5 {
        println!("Count: {}", count);
        count += 1;
    }
}

এখানে, while লুপটি চলতে থাকবে যতক্ষণ না count ৫ এর সমান বা বড় হয়ে যায়।


৪. for loop (ফর লুপ)

for লুপ একটি নির্দিষ্ট রেঞ্জ বা কালেকশন (যেমন অ্যারে, ভেক্টর) এর উপাদানগুলির উপর ইটারেট করতে ব্যবহৃত হয়। এটি একটি নির্দিষ্ট শর্তে থেমে যায়, যেমন একটি কালেকশনের শেষ উপাদান।

উদাহরণ:

fn main() {
    let numbers = [1, 2, 3, 4, 5];

    for number in numbers.iter() {
        println!("Number: {}", number);
    }
}

এখানে, for লুপটি অ্যারের প্রতিটি উপাদানের জন্য এক এক করে কাজ করবে এবং তা আউটপুট করবে।


৫. match (ম্যাচ)

match একটি শক্তিশালী কন্ট্রোল ফ্লো উপাদান যা মানগুলোর সাথে তুলনা করে এবং সেই অনুযায়ী কার্যকলাপ নির্ধারণ করে। এটি অনেকটা switch কেসের মতো, তবে অনেক বেশি শক্তিশালী।

উদাহরণ:

fn main() {
    let number = 3;

    match number {
        1 => println!("One"),
        2 => println!("Two"),
        3 => println!("Three"),
        _ => println!("Other"), // Default case
    }
}

এখানে, match স্টেটমেন্টটি number এর মানের উপর ভিত্তি করে আলাদা আলাদা আউটপুট প্রদর্শন করবে।


৬. return (রিটার্ন)

return স্টেটমেন্টটি ফাংশন থেকে মান ফেরত পাঠাতে ব্যবহৃত হয় এবং কার্যক্রম বন্ধ করে দেয়। রাস্টে, ফাংশনের শেষ লাইনে return ব্যবহার না করলেও কোনো ভ্যালু ফেরত দেয়া যেতে পারে।

উদাহরণ:

fn add(a: i32, b: i32) -> i32 {
    a + b // return এখানে আদর্শ ব্যবহার, এটির মাধ্যমে স্বয়ংক্রিয়ভাবে return হবে
}

fn main() {
    let sum = add(5, 7);
    println!("Sum is: {}", sum);
}

এখানে add ফাংশনটি দুটি ইনপুট নিয়ে তাদের যোগফল রিটার্ন করবে।


সারাংশ

রাস্টে কন্ট্রোল ফ্লো ব্যবহারের জন্য বিভিন্ন টুলস রয়েছে, যেমন if/else, loop, while, for, match এবং return। এই উপাদানগুলি দিয়ে আমরা কোডের কার্যক্রম নিয়ন্ত্রণ করতে পারি, শর্তাধীন লজিক প্রয়োগ করতে পারি, ইনফিনিট লুপ বা নির্দিষ্ট শর্তের ভিত্তিতে লুপ চালাতে পারি এবং ফাংশন থেকে মান রিটার্ন করতে পারি। কন্ট্রোল ফ্লো ব্যবহারের মাধ্যমে প্রোগ্রামটির কার্যক্ষমতা এবং পাঠযোগ্যতা উন্নত করা সম্ভব।

Content added By

if স্টেটমেন্ট

if স্টেটমেন্ট ব্যবহৃত হয় কোনো একটি শর্ত চেক করতে। যদি শর্তটি সত্য (true) হয়, তাহলে নির্দিষ্ট ব্লকটি এক্সিকিউট হয়। যদি শর্তটি মিথ্যা (false) হয়, তবে সেই ব্লকটি এক্সিকিউট হয় না।

Syntax:

if condition {
    // code block to be executed if condition is true
}

উদাহরণ:

fn main() {
    let x = 5;

    if x > 3 {
        println!("x is greater than 3");
    }
}

এখানে, যেহেতু x ৩ এর থেকে বড়, তাই println! স্টেটমেন্টটি চালু হবে এবং আউটপুট হবে x is greater than 3


else স্টেটমেন্ট

else স্টেটমেন্টটি একটি বিকল্প ব্লক হিসেবে কাজ করে যা শুধুমাত্র তখন এক্সিকিউট হয় যখন if শর্তটি মিথ্যা (false) হয়।

Syntax:

if condition {
    // code block if condition is true
} else {
    // code block if condition is false
}

উদাহরণ:

fn main() {
    let x = 2;

    if x > 3 {
        println!("x is greater than 3");
    } else {
        println!("x is less than or equal to 3");
    }
}

এখানে, যেহেতু x ৩ এর থেকে কম বা সমান, তাই else ব্লকটি এক্সিকিউট হবে এবং আউটপুট হবে x is less than or equal to 3


else if স্টেটমেন্ট

else if স্টেটমেন্টটি একাধিক শর্ত পরীক্ষা করতে ব্যবহৃত হয়। প্রথম শর্ত মিথ্যা হলে, else if শর্তটি চেক করা হয় এবং যদি সেটি সত্য হয়, তাহলে সেটি এক্সিকিউট হয়। একাধিক else if শর্তও ব্যবহার করা যেতে পারে।

Syntax:

if condition1 {
    // code block if condition1 is true
} else if condition2 {
    // code block if condition2 is true
} else {
    // code block if both conditions are false
}

উদাহরণ:

fn main() {
    let x = 5;

    if x > 10 {
        println!("x is greater than 10");
    } else if x == 5 {
        println!("x is equal to 5");
    } else {
        println!("x is less than 5");
    }
}

এখানে, x ৫ এর সমান, তাই দ্বিতীয় else if ব্লকটি এক্সিকিউট হবে এবং আউটপুট হবে x is equal to 5


সারাংশ

  • if: একটি শর্ত যাচাই করে এবং সত্য হলে কোড এক্সিকিউট করে।
  • else: if শর্ত মিথ্যা হলে বিকল্প কোড এক্সিকিউট করে।
  • else if: একাধিক শর্ত পরীক্ষা করে এবং যদি কোনো একটি শর্ত সত্য হয়, তখন সংশ্লিষ্ট কোড এক্সিকিউট হয়।

এই স্টেটমেন্টগুলি সাধারণত শর্তভিত্তিক কোড নিয়ন্ত্রণে ব্যবহৃত হয়।

Content added By

match এক্সপ্রেশন কী?

রাস্টের match এক্সপ্রেশন একটি শক্তিশালী কন্ট্রোল ফ্লো স্টেটমেন্ট, যা এক বা একাধিক প্যাটার্নের সাথে একটি ভ্যালুর তুলনা করে। এটি সি, সি++, জাভা বা পিথনের switch স্টেটমেন্টের মতো মনে হতে পারে, তবে match অনেক বেশি শক্তিশালী এবং নমনীয়। এর সাহায্যে আপনি একাধিক প্যাটার্নের উপর ভিত্তি করে সহজে সিদ্ধান্ত নিতে পারেন।

match এক্সপ্রেশন এর মূল বৈশিষ্ট্য:

  1. প্যাটার্ন ম্যাচিং: match এক্সপ্রেশন অনেক ধরনের প্যাটার্ন (যেমন: লিটারাল, রেঞ্জ, টুপল, স্ট্রাকচার, enum) সাপোর্ট করে।
  2. অটো ফ্যালিব্যাক: যদি কোনো প্যাটার্ন মেলানো না যায়, তবে ডিফল্ট প্যাটার্ন ব্যবহার করা যেতে পারে।
  3. সুরক্ষা: এটি কোডের ভ্যালিডিটি নিশ্চিত করে, কারণ সমস্ত প্যাটার্নের ক্ষেত্রে কোডটি চেক করা হয়। এর ফলে ভুলের সম্ভাবনা কমে যায়।

match এক্সপ্রেশন এর সাধারণ সঠিক ব্যবহার

উদাহরণ ১: সাধারণ match এক্সপ্রেশন

fn main() {
    let number = 7;

    match number {
        1 => println!("One"),
        2 => println!("Two"),
        3 => println!("Three"),
        _ => println!("Other"),  // _ wildcard: any value that doesn't match above
    }
}

ব্যাখ্যা:
এখানে number এর মান ৭, তাই match এক্সপ্রেশনটি _ => println!("Other") তে চলে যাবে। _ একটি wildcard প্যাটার্ন, যা অন্য কোনো প্যাটার্ন না মেলালে ব্যবহৃত হয়।

উদাহরণ ২: রেঞ্জের সাথে match ব্যবহার

fn main() {
    let number = 10;

    match number {
        1..=5 => println!("Between 1 and 5"),  // Range from 1 to 5 (inclusive)
        6..=10 => println!("Between 6 and 10"), // Range from 6 to 10 (inclusive)
        _ => println!("Other"),
    }
}

ব্যাখ্যা:
এখানে 1..=5 এবং 6..=10 রেঞ্জগুলো নির্দিষ্ট করা হয়েছে। ১০ এর মধ্যে থাকা মান 6..=10 প্যাটার্নে মেলে এবং "Between 6 and 10" আউটপুট হবে।

উদাহরণ ৩: Enum এর সাথে match ব্যবহার

enum Color {
    Red,
    Green,
    Blue,
}

fn main() {
    let color = Color::Green;

    match color {
        Color::Red => println!("Red color"),
        Color::Green => println!("Green color"),
        Color::Blue => println!("Blue color"),
    }
}

ব্যাখ্যা:
এখানে Color নামক enum ব্যবহার করা হয়েছে। match এক্সপ্রেশনটি নির্দিষ্ট enum ভ্যারিয়েবলের মান অনুসারে বিভিন্ন আউটপুট প্রিন্ট করবে। উদাহরণে, Color::Green মেলানো হবে এবং "Green color" আউটপুট হবে।

উদাহরণ ৪: টুপল (Tuple) এর সাথে match ব্যবহার

fn main() {
    let point = (3, 5);

    match point {
        (0, 0) => println!("Origin"),
        (0, y) => println!("On the y axis at {}", y),
        (x, 0) => println!("On the x axis at {}", x),
        (x, y) => println!("Point at ({}, {})", x, y),
    }
}

ব্যাখ্যা:
এখানে (3, 5) নামক টুপল ব্যবহার করা হয়েছে। match এক্সপ্রেশনটি টুপলটির প্রতিটি উপাদান চেক করবে এবং সঠিক প্যাটার্নের সাথে মেলালে সেই প্যাটার্নের কোড এক্সিকিউট হবে। Point at (3, 5) আউটপুট হবে।

উদাহরণ ৫: match এর সাথে Option ব্যবহার

Option টাইপটি রাস্টের একটি বিশেষ ডেটা টাইপ, যা Some বা None এর মধ্যে একটি মান ধারণ করতে পারে।

fn main() {
    let some_number = Some(10);

    match some_number {
        Some(i) => println!("Got a number: {}", i),
        None => println!("No number"),
    }
}

ব্যাখ্যা:
এখানে Some(10) ভ্যালু দেওয়া হয়েছে। তাই Some(i) প্যাটার্নটি মেলানো হবে এবং "Got a number: 10" আউটপুট হবে।

উদাহরণ ৬: match এবং Ref ব্যবহার

match এক্সপ্রেশনটি & (reference) এর সাথে খুবই কার্যকরী হতে পারে।

fn main() {
    let value = 42;

    match &value {
        &42 => println!("It's 42"),
        _ => println!("Not 42"),
    }
}

ব্যাখ্যা:
এখানে &value দ্বারা ভ্যালুকে রেফারেন্স হিসেবে পাস করা হচ্ছে এবং match এক্সপ্রেশনটি সেই রেফারেন্সে মেলানো মান চেক করে। এই উদাহরণে আউটপুট "It's 42" হবে।


match এর কিছু গুরুত্বপূর্ণ সুবিধা:

  1. প্যাটার্ন ম্যাচিং: match এক্সপ্রেশন প্যাটার্ন মেলানোর ক্ষেত্রে অনেক বেশি শক্তিশালী এবং নমনীয়।
  2. নিরাপত্তা: এটি সব প্যাটার্ন চেক করে, যাতে ভুলে কোন মান ছেড়ে না যায় (যেমন, না দেখানো কিছু প্যাটার্ন থাকলে কম্পাইলার সতর্ক করবে)।
  3. ট্রান্সপারেন্সি এবং কোডের পরিষ্কারতা: অনেক ধরনের শর্ত এবং প্যাটার্ন খুব সহজে চিহ্নিত করা যায়, ফলে কোড খুবই পরিষ্কার এবং পাঠযোগ্য হয়।

সারাংশ

রাস্টের match এক্সপ্রেশন একটি অত্যন্ত শক্তিশালী কন্ট্রোল ফ্লো ফিচার যা বিভিন্ন ধরনের প্যাটার্ন এবং কন্ডিশন চেক করতে সাহায্য করে। এটি সাধারণ switch স্টেটমেন্টের চেয়ে অনেক বেশি নমনীয় এবং শক্তিশালী, কারণ এটি শুধুমাত্র সিম্পল মান না, বরং রেঞ্জ, টুপল, enum এবং আরও অনেক ধরনের প্যাটার্নের সাথে কাজ করতে পারে। match এক্সপ্রেশন রাস্টের নিরাপত্তা এবং পারফরম্যান্স বৃদ্ধিতেও গুরুত্বপূর্ণ ভূমিকা পালন করে।

Content added By

for লুপ

রাস্টে for লুপ সবচেয়ে শক্তিশালী এবং সাধারণত ব্যবহৃত লুপ টাইপ। এটি সাধারণত ইটারেটর এবং রেঞ্জ (range) এর মাধ্যমে একটি রেঞ্জ বা কালেকশনের উপর iterate করতে ব্যবহৃত হয়।

for লুপ ব্যবহার:

for লুপের মাধ্যমে আপনি কোন কালেকশনের প্রতিটি উপাদান বা একটি নির্দিষ্ট রেঞ্জের মধ্যে লুপ চালাতে পারেন।

উদাহরণ:

fn main() {
    // রেঞ্জের মাধ্যমে for লুপ
    for i in 1..6 {
        println!("i: {}", i); // 1 থেকে 5 পর্যন্ত প্রিন্ট করবে
    }

    // ভেক্টরের উপাদান iterating
    let numbers = vec![10, 20, 30];
    for num in numbers {
        println!("number: {}", num); // ভেক্টরের প্রতিটি উপাদান প্রিন্ট হবে
    }
}

ব্যাখ্যা:

  • 1..6 একটি রেঞ্জ, যেখানে 1 থেকে 5 পর্যন্ত সংখ্যা ধরে রাখা হয় (6 বাদ)।
  • ভেক্টরের প্রতিটি উপাদান for num in numbers এর মাধ্যমে এক এক করে প্রিন্ট হবে। এই পদ্ধতিতে owning পরিবর্তন হয়, অর্থাৎ numbers ভেক্টর লুপ শেষে আর ব্যবহার করা যাবে না।

while লুপ

while লুপ সাধারণত কোনো নির্দিষ্ট শর্ত পর্যন্ত চলতে থাকে। এটি ব্যবহার করা হয় যখন লুপ চালানোর জন্য শর্ত পরিবর্তন করা প্রয়োজন এবং শর্তের ভিত্তিতে লুপটি শেষ হবে।

while লুপ ব্যবহার:

উদাহরণ:

fn main() {
    let mut count = 0;
    while count < 5 {
        println!("count: {}", count); // 0 থেকে 4 পর্যন্ত প্রিন্ট হবে
        count += 1;
    }
}

ব্যাখ্যা:
এখানে while লুপটি চলবে যতক্ষণ না count ৫ এর কম থাকে। প্রতি পুনরাবৃত্তিতে count এর মান বৃদ্ধি পাবে এবং শেষ পর্যন্ত লুপ বন্ধ হবে।


loop (আনলিমিটেড লুপ)

loop হল একটি অপরিবর্তনীয় লুপ যা চলতে থাকে যতক্ষণ না এটি break কমান্ড দ্বারা বন্ধ করা হয়। এটি তখন ব্যবহার করা হয় যখন আপনি বিশেষ কোনো শর্তের উপর ভিত্তি করে লুপকে চিরকাল চলতে রাখতে চান এবং পরে কোনো শর্তে এটি বন্ধ করতে চান।

loop ব্যবহার:

উদাহরণ:

fn main() {
    let mut counter = 0;
    loop {
        if counter == 5 {
            break; // যখন counter 5 হবে, লুপ বন্ধ হবে
        }
        println!("counter: {}", counter);
        counter += 1;
    }
}

ব্যাখ্যা:
এখানে loop অনির্দিষ্ট সময়ের জন্য চলতে থাকে, কিন্তু counter ৫ হলে break দ্বারা লুপ বন্ধ হয়ে যাবে।


সারাংশ

  • for লুপ সাধারণত নির্দিষ্ট রেঞ্জ বা কালেকশন থেকে আইটেম লুপ করার জন্য ব্যবহার হয়।
  • while লুপ শর্তের উপর ভিত্তি করে লুপ চলতে থাকে এবং একটি নির্দিষ্ট শর্ত সন্তুষ্ট না হওয়া পর্যন্ত চালানো হয়।
  • loop লুপ অবিরত চলতে থাকে, যতক্ষণ না শর্তের ভিত্তিতে তা break দিয়ে বন্ধ করা হয়।

এগুলি রাস্টে লুপিংয়ের বিভিন্ন পদ্ধতি এবং প্রতিটি পদ্ধতির জন্য নির্দিষ্ট পরিস্থিতিতে ব্যবহারের সুবিধা রয়েছে।

Content added By

Pattern Matching (প্যাটার্ন ম্যাচিং)

রাস্টে Pattern Matching একটি শক্তিশালী ফিচার, যা কোডে বিভিন্ন ধরণের ডেটা টাইপের সাথে মেলে এমন প্যাটার্নকে শনাক্ত করতে ব্যবহৃত হয়। এটি match কিওয়ার্ডের মাধ্যমে কাজ করে এবং এটি ভিন্ন ভিন্ন কন্ডিশন বা স্টেটমেন্টের জন্য বিভিন্ন প্যাটার্ন পরীক্ষা করে।

Pattern Matching এর মৌলিক ব্যবহার:

match কিওয়ার্ড ব্যবহার করে ডেটার বিভিন্ন প্যাটার্ন চেক করা হয়। এটি কোডের পাঠযোগ্যতা ও সুরক্ষা বাড়ায়, কারণ এটি প্রোগ্রামারকে সহজে সমস্ত সম্ভাব্য কেস ক্যাপচার করতে সাহায্য করে।

উদাহরণ:

fn main() {
    let number = 5;
    
    match number {
        1 => println!("One"),
        2 => println!("Two"),
        3 => println!("Three"),
        _ => println!("Other"), // _ wildcard used to match any value
    }
}

এখানে, match স্টেটমেন্ট number এর মান অনুযায়ী মেলে এবং নির্দিষ্ট আউটপুট প্রিন্ট করে।

Pattern Matching এর কিছু উন্নত ব্যবহার:

  • Tuples and Structs: প্যাটার্ন ম্যাচিং সঞ্চালনের সময় আপনি টুপল বা স্ট্রাকচার (struct) এর মধ্যে ডেটা ম্যাচ করতে পারেন।
  • Enums: রাস্টে enum টাইপের প্যাটার্ন ম্যাচিং খুবই সাধারণ এবং শক্তিশালী।

উদাহরণ (Enum এর সাথে):

enum Color {
    Red,
    Green,
    Blue,
}

fn main() {
    let color = Color::Green;
    
    match color {
        Color::Red => println!("Red"),
        Color::Green => println!("Green"),
        Color::Blue => println!("Blue"),
    }
}

এখানে, match ব্যবহার করে Color নামক enum এর বিভিন্ন কেস চেক করা হচ্ছে।

Pattern Matching এর সুবিধা:

  • বিভিন্ন ডেটা টপের জন্য প্যাটার্ন পরীক্ষা: match স্টেটমেন্ট দিয়ে বিভিন্ন ধরনের ডেটার মান পরীক্ষা করা যায়, যেমন সংখ্যা, স্ট্রাকচার, টুপল ইত্যাদি।
  • ডিফল্ট কেস: _ এর মাধ্যমে কোনও প্যাটার্নের জন্য ডিফল্ট কেস রাখতে পারেন।

Complex Control Structures (কমপ্লেক্স কন্ট্রোল স্ট্রাকচার)

রাস্টে complex control structures অন্তর্ভুক্ত করে কিছু শক্তিশালী ফিচার, যেমন if-let, while let, for লুপ, এবং আরও অনেক কিছু। এই কন্ট্রোল স্ট্রাকচারগুলি রাস্টের স্ট্যাটিক টাইপিং এবং প্যাটার্ন ম্যাচিং সিস্টেমের সাথে একত্রিত হয়ে খুবই শক্তিশালী এবং নমনীয় হয়।

if-let:

if-let একটি সংক্ষিপ্ত উপায়, যা সাধারণত প্যাটার্ন ম্যাচিংয়ের সাথে ব্যবহৃত হয়। এটি সাধারণ if কন্ডিশনের সাথে প্যাটার্ন ম্যাচিংয়ের ব্যবহার সহজ করে তোলে।

উদাহরণ:

fn main() {
    let some_option = Some(5);

    if let Some(x) = some_option {
        println!("The value is: {}", x);
    } else {
        println!("No value present");
    }
}

এখানে, if-let ব্যবহার করা হয়েছে Some(x) প্যাটার্নের সাথে ম্যাচ করার জন্য। যদি some_option ভ্যালু থাকে, তাহলে এটি ঐ ভ্যালু প্রিন্ট করবে।

while-let:

while-let প্যাটার্ন ম্যাচিংয়ের সাথে while লুপ ব্যবহারের এক শক্তিশালী পদ্ধতি। এটি প্রক্রিয়া চলতে থাকা অবস্থায় ডেটা ম্যাচ করতে সহায়ক।

উদাহরণ:

fn main() {
    let mut numbers = vec![1, 2, 3, 4, 5];
    
    while let Some(n) = numbers.pop() {
        println!("{}", n);
    }
}

এখানে, while-let ব্যবহার করা হয়েছে Some(n) প্যাটার্নে, যাতে লুপ চলাকালীন numbers ভেক্টর থেকে উপাদানগুলো বের করা হয়।

for loop with Pattern Matching:

রাস্টে for লুপ ব্যবহার করে প্যাটার্ন ম্যাচিংয়ের মাধ্যমে বিভিন্ন ধরনের ডেটার উপর কাজ করা যেতে পারে। এটি খুবই সুবিধাজনক যখন আপনাকে একটি কনটেইনার বা কালেকশন এর প্রতিটি উপাদানের সাথে কাজ করতে হয়।

উদাহরণ:

enum Direction {
    Up,
    Down,
    Left,
    Right,
}

fn main() {
    let moves = vec![Direction::Up, Direction::Left, Direction::Down];
    
    for movement in moves {
        match movement {
            Direction::Up => println!("Move up"),
            Direction::Down => println!("Move down"),
            Direction::Left => println!("Move left"),
            Direction::Right => println!("Move right"),
        }
    }
}

এখানে, for লুপের মধ্যে match ব্যবহৃত হয়েছে যাতে প্রতিটি Direction প্যাটার্নের জন্য আলাদা কাজ করা যায়।


Complex Control Structures এবং Pattern Matching এর স্নিগ্ধ সংমিশ্রণ

রাস্টে Complex Control Structures এবং Pattern Matching একসাথে ব্যবহার করা হয় যেখানে খুব বেশি লজিকাল চেক এবং কন্ডিশনাল রাউন্ড তৈরি করার প্রয়োজন পড়ে। এই দুইটি বৈশিষ্ট্য রাস্টের কোডিংয়ের ক্ষমতা বৃদ্ধি করে এবং কোডের গঠন আরও পরিষ্কার ও সুরক্ষিত করে।

উদাহরণ (Complex Pattern Matching):

enum Shape {
    Circle(f64),
    Rectangle(f64, f64),
}

fn main() {
    let shape = Shape::Rectangle(10.0, 5.0);
    
    match shape {
        Shape::Circle(radius) => println!("Circle with radius {}", radius),
        Shape::Rectangle(width, height) => println!("Rectangle with width {} and height {}", width, height),
    }
}

এখানে, match স্টেটমেন্ট ব্যবহার করে একটি enum প্যাটার্ন পরীক্ষা করা হচ্ছে যেখানে বিভিন্ন শেপের জন্য ভিন্ন ভিন্ন কেস তৈরি করা হয়েছে।


সারাংশ

রাস্টের Pattern Matching এবং Complex Control Structures প্রোগ্রামিংকে আরও শক্তিশালী এবং পরিষ্কার করে তোলে। প্যাটার্ন ম্যাচিংয়ের মাধ্যমে ডেটার বিভিন্ন প্যাটার্নের সাথে কাজ করা সহজ হয় এবং বিভিন্ন কন্ট্রোল স্ট্রাকচার যেমন if-let, while-let, এবং for লুপগুলি কোডের কার্যকারিতা এবং পাঠযোগ্যতা বৃদ্ধি করে। রাস্টের এই বৈশিষ্ট্যগুলি ডেভেলপারদের নিরাপদ, দক্ষ এবং দ্রুত কোড লিখতে সাহায্য করে।

Content added By
Promotion

Are you sure to start over?

Loading...