blog.dopana

Back

Bài thứ tư trong loạt Rust cơ bản. Hàm là cách bạn đặt tên và tái sử dụng logic. Hàm Rust rất đơn giản — ý tưởng then chốt là gần như mọi thứ đều là biểu thức.

Hàm đầu tiên#

fn add(a: i32, b: i32) -> i32 {
    a + b
}

fn main() {
    let result = add(3, 4);
    println!("{result}");   // 7
}
rust

Tham số khai báo kiểu; kiểu trả về nằm sau ->.

Statement so với expression#

Statement thực hiện một hành động và không trả về gì. Expression tính ra một giá trị.

fn add(a: i32, b: i32) -> i32 {
    let sum = a + b;   // statement, kết thúc bằng dấu chấm phẩy
    sum                // expression, không có chấm phẩy
}
rust

Expression cuối — không có dấu chấm phẩy — là giá trị trả về. Nếu thêm chấm phẩy, hàm trả về () thay vì giá trị.

Trả về sớm#

Dùng return để thoát sớm:

fn is_adult(age: u32) -> bool {
    if age >= 18 {
        return true;
    }
    false
}
rust

Không có giá trị trả về#

Hàm không tạo ra gì có kiểu đơn vị ():

fn greet(name: &str) {
    println!("Hello, {name}!");
}
rust

Kiểu trả về ngầm định là ().

Truyền quyền sở hữu#

Mặc định, truyền giá trị vào hàm sẽ di chuyển nó (chi tiết ở bài sau về ownership):

fn print_len(s: String) {
    println!("{}", s.len());
}

fn main() {
    let s = String::from("hello");
    print_len(s);   // s bị di chuyển
    // println!("{s}");  // lỗi: s không còn tồn tại
}
rust

Hàm generic#

Hàm có thể generic theo kiểu bằng dấu ngoặc nhọn:

fn first<T>(list: &[T]) -> &T {
    &list[0]
}
rust

T đại diện cho mọi kiểu. Trình biên dịch suy luận nó từ chỗ gọi.

Kết luận#

Hàm Rust là biểu thức từ đầu đến cuối: tham số có kiểu, expression cuối là giá trị trả về, và quyền sở hữu đi cùng giá trị. Bài tiếp theo trong loạt: ownership.

Tài liệu tham khảo#