পাঠ ৩.৩

Function কীভাবে কাজ করে

Functions

Function Rust code-এর basic building block। এই পাঠে আমরা দেখব function declare করা, parameter এবং return value পাঠানো, এবং Rust-এর সবচেয়ে গুরুত্বপূর্ণ একটা concept — statement বনাম expression

Function syntax

fn keyword দিয়ে function declare হয়। Rust-এর convention — function এবং variable নাম snake_case: সব lowercase, word-এর মাঝে underscore।

src/main.rsrust
fn main() {
    println!("Hello, world!");

    another_function();
}

fn another_function() {
    println!("Another function.");
}
terminal outputtext
Hello, world!
Another function.

লক্ষ্য করো — another_function main-এর পরে define করা; কিন্তু আমরা আগে call করতে পারছি। Rust-এ function কোথায় define করা সেটা গুরুত্বপূর্ণ না, যতক্ষণ caller-এর scope-এ visible।

Parameter

Function-এর signature-এ parameter declare করা যায় — প্রতিটার type আবশ্যক। এই deliberate decision-এর কারণে compiler-এর error message সাহায্যকারী হয়।

src/main.rsrust
fn main() {
    another_function(5);
}

fn another_function(x: i32) {
    println!("The value of x is: {x}");
}

একাধিক parameter — comma-separated:

src/main.rsrust
fn main() {
    print_labeled_measurement(5, 'h');
}

fn print_labeled_measurement(value: i32, unit_label: char) {
    println!("The measurement is: {value}{unit_label}");
}
terminal outputtext
The measurement is: 5h

Statement বনাম Expression

Rust একটা expression-based language — এই পার্থক্যটা না বুঝলে পরের অনেক কিছু confusing লাগবে।

  • Statement — কোনো action perform করে, কিন্তু value return করে না।
  • Expression — evaluate হয়ে একটা value দেয়।

Statement — value return করে না

let দিয়ে variable bind করা একটা statement। Function definition-ও statement।

fn main() {
    let y = 6;
}

এই কারণে let-কে আরেকটা variable-এ assign করা যায় না:

fn main() {
    let x = (let y = 6);
}
compile errortext
error: expected expression, found `let` statement
 --> src/main.rs:2:14
  |
2 |     let x = (let y = 6);
  |              ^^^

C, Ruby, JavaScript-এ x = y = 6 কাজ করে — কারণ assignment ঐ language-গুলোতে value return করে। Rust-এ করে না।

Expression — value হয়

Math operation (5 + 6) → 11; function call expression; macro call expression; block (curly bracket) expression।

src/main.rsrust
fn main() {
    let y = {
        let x = 3;
        x + 1
    };

    println!("The value of y is: {y}");
}

Block-টা evaluate হয়ে 4 দিচ্ছে, যেটা y-এ bind হলো।

খুবই গুরুত্বপূর্ণ: expression-এর শেষে semicolon নেই। semicolon দিলে এটা statement হয়ে যাবে — value আর return করবে না।

Return value

Return type declare হয় -> arrow-এর পরে। Function-এর শেষ expression-এর value-ই return হয় (early return চাইলে return keyword)।

src/main.rsrust
fn five() -> i32 {
    5
}

fn main() {
    let x = five();

    println!("The value of x is: {x}");
}

লক্ষ্য করো — 5-এর পর semicolon নেই। থাকলে এটা statement হয়ে যেত, return হতো না।

Parameter সহ:

src/main.rsrust
fn main() {
    let x = plus_one(5);

    println!("The value of x is: {x}");
}

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

Semicolon-এর ভুল

নতুন Rust developer-এর সবচেয়ে common bug:

src/main.rsrust
fn plus_one(x: i32) -> i32 {
    x + 1;
}
compile errortext
error[E0308]: mismatched types
 --> src/main.rs:7:24
  |
7 | fn plus_one(x: i32) -> i32 {
  |    --------            ^^^ expected `i32`, found `()`
  |    |
  |    implicitly returns `()` as its body has no tail or `return` expression
8 |     x + 1;
  |          - help: remove this semicolon to return this value

Function declaration বলেছে i32 return করবে, কিন্তু body-এর শেষে semicolon থাকায় কিছুই return হচ্ছে না (অর্থাৎ () — unit type)। Compiler সরাসরি বলে দিচ্ছে — semicolon সরাও।

এই পাঠ থেকে যা শিখলে

  • fn দিয়ে function; convention snake_case
  • Parameter-এর type আবশ্যক; multiple parameter comma-separated।
  • Statement action করে, value return করে না; expression value-এ evaluate হয়।
  • Block ({...}) একটা expression — শেষ expression-ই value।
  • Return type -> T; function body-এর শেষ expression-ই return value (semicolon থাকলে statement হয়ে যাবে)।