📁 Modules: Tổ Chức Code
🎯 Mục Tiêu Bài Học
Sau khi hoàn thành bài học này, bạn sẽ:
- ✅ Hiểu được module system trong Rust
- ✅ Sử dụng
modkeyword - ✅ Kiểm soát visibility với
pub - ✅ Tạo nested modules
- ✅ Tổ chức code với files và folders
- ✅ Áp dụng best practices
🤔 Module Là Gì?
Ẩn Dụ Cuộc Sống: Tủ Hồ Sơ
Module giống như tủ hồ sơ trong văn phòng:
📁 Tủ Hồ Sơ:
- Chia thành nhiều ngăn
- Mỗi ngăn chứa tài liệu liên quan
- Có ngăn công khai, có ngăn riêng tư
- Dễ tìm, dễ quản lý
📦 Module Trong Rust:
- Tổ chức code thành các phần logic
- Mỗi module chứa functions, structs, ... liên quan
- Kiểm soát public/private
- Namespace riêng
Ví Dụ Cơ Bản
mod math {
pub fn add(a: i32, b: i32) -> i32 {
a + b
}
fn private_helper() {
println!("This is private");
}
}
fn main() {
let result = math::add(5, 3);
println!("Result: {}", result);
// math::private_helper(); // ❌ Lỗi - private!
}
📦 Định Nghĩa Modules
Inline Module
mod greetings {
pub fn hello() {
println!("Hello!");
}
pub fn goodbye() {
println!("Goodbye!");
}
}
fn main() {
greetings::hello();
greetings::goodbye();
}
Nested Modules
mod outer {
pub mod inner {
pub fn function() {
println!("Called from inner module");
}
}
pub fn outer_function() {
println!("Called from outer module");
inner::function();
}
}
fn main() {
outer::outer_function();
outer::inner::function();
}
🔒 Visibility với pub
Private by Default
mod my_module {
fn private_function() {
println!("Private");
}
pub fn public_function() {
println!("Public");
private_function(); // OK - same module
}
}
fn main() {
my_module::public_function();
// my_module::private_function(); // ❌ Lỗi!
}
Struct Fields
mod person {
pub struct Person {
pub name: String,
age: u32, // private
}
impl Person {
pub fn new(name: String, age: u32) -> Person {
Person { name, age }
}
pub fn age(&self) -> u32 {
self.age
}
}
}
fn main() {
let p = person::Person::new(String::from("Alice"), 30);
println!("Name: {}", p.name); // OK - public
println!("Age: {}", p.age()); // OK - through method
// println!("Age: {}", p.age); // ❌ Lỗi - private field!
}
Enum Variants
mod status {
pub enum Status {
Active,
Inactive,
}
}
fn main() {
let s = status::Status::Active;
// Enum variants are public if enum is public
}