পাঠ ৭.২

Module দিয়ে scope ও privacy control করা

Defining Modules to Control Scope and Privacy

Module related code-কে group করে, এবং কী public আর কী private সেটা নির্ধারণ করে। এই পাঠে module declare করা, file-এ extend করা, এবং module tree-এর কাঠামো দেখব।

Module cheat sheet

সংক্ষেপে Rust-এর module system এই কয়েকটা rule-এ চলে:

  • Crate root থেকে শুরু: compile-এর সময় Rust src/lib.rs বা src/main.rs-এ প্রথমে যায়।
  • Module declare: crate root-এ mod garden; লিখলে compiler module-এর content খুঁজবে — (১) inline curly bracket-এ, (২) src/garden.rs-এ, বা (৩) src/garden/mod.rs-এ।
  • Submodule declare: src/garden.rs-এ mod vegetables; দিলে compiler খুঁজবে — (১) inline, (২) src/garden/vegetables.rs-এ, (৩) src/garden/vegetables/mod.rs-এ।
  • Path: এক crate-এর যেকোনো জায়গা থেকে module-এর item-কে refer করা যায় path দিয়ে — যেমন crate::garden::vegetables::Asparagus
  • Private vs public: Module-এর code default-এ parent থেকে private। pub mod বা pub দিয়ে public।
  • use keyword: Long path-এর shortcut বানাতে।

Backyard example

Directory structure:

backyard
├── Cargo.lock
├── Cargo.toml
└── src
    ├── garden
    │   └── vegetables.rs
    ├── garden.rs
    └── main.rs
src/main.rsrust
use crate::garden::vegetables::Asparagus;

pub mod garden;

fn main() {
    let plant = Asparagus {};
    println!("I'm growing {plant:?}!");
}
src/garden.rsrust
pub mod vegetables;
src/garden/vegetables.rsrust
#[derive(Debug)]
pub struct Asparagus {}

Restaurant — main example

এই পাঠের পরের অংশে আমরা একটা restaurant library use করব। নতুন project:

terminalbash
$ cargo new restaurant --lib
src/lib.rsrust
mod front_of_house {
    mod hosting {
        fn add_to_waitlist() {}

        fn seat_at_table() {}
    }

    mod serving {
        fn take_order() {}

        fn serve_order() {}

        fn take_payment() {}
    }
}

mod keyword + module-এর নাম + curly bracket-এ body। Module-এর ভিতরে আরও module রাখা যায় (নেস্টেড)। এছাড়া struct, enum, constant, trait, function — সব রাখা যায়।

Module tree

উপরের code-এর module tree:

crate
 └── front_of_house
     ├── hosting
     │   ├── add_to_waitlist
     │   └── seat_at_table
     └── serving
         ├── take_order
         ├── serve_order
         └── take_payment

Hierarchical structure — এর ভিতরে যেগুলো same level-এ, সেগুলো sibling; ভিতরের module child, বাইরেরটা parent। সবার উপরে implicit crate module।

এটা অনেকটা filesystem-এর মতো — হোম directory-র ভিতরে folder, তার ভিতরে folder। পরের পাঠে দেখব এদের refer করতে path use করা হয়।

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

  • mod name {...} দিয়ে module declare — inline বা separate file।
  • File-এ ছড়াতে — mod name; declare, compiler name.rs বা name/mod.rs-এ খুঁজবে।
  • Module tree — crate root থেকে শুরু, parent/child/sibling relationship।
  • Default-এ module private; pub দিয়ে public।