Rust – Hàm


Được đăng vào ngày 06/10/2017 | 0 bình luận
Rust – Hàm
Đánh giá bài viết

Điểm khởi đầu của bất cứ một chương trình Rust nào cũng là đoạn fn main(), đây là một hàm trong Rust, hàm được định nghĩa bởi từ khóa fn, phía sau là tên hàm rồi kèm thêm cặp dấu () và cuối cùng là một khối lệnh. Hàm là một nhóm các đoạn code thực hiện một công việc nào đó và có thể được gọi để sử dụng ở nhiều nơi khác nhau. Trong một chương trình Rust có thể viết bao nhiêu hàm cũng được.

Ví dụ:

fn main() { 
    say_hello(); 
    hello_name("Pho Code");
}

fn say_hello() { 
    println!("Hello from sayHello()");
}

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

Đoạn code trên sẽ cho ra kết quả như sau:

Hello from sayHello()
Hello Pho Code

Trong đoạn code trên chúng ta viết 2 hàm là say_hello()hello_name(), chúng ta gọi các hàm này bằng cách ghi tên chúng ra, ở đây chúng ta gọi 2 hàm này trong hàm main() với các câu lệnh say_hello();hello_name("Pho Code");. Bên trong hàm say_hello() là câu lệnh println!() để in một chuỗi lên màn hình. Còn hàm hello_name() thì có nhận thêm cả tham số và in chuỗi có kèm tham số đó lên màn hình.

Tham số là các giá trị được gửi kèm khi gọi hàm, và các hàm có thể sử dụng các tham số này như các biến bình thường. Trong hàm hello_name(), tham só được đặt tên là name và có kiểu dữ liệu là &str. Các hàm có thể nhận bao nhiêu tham số cũng được.

Hàm trả giá trị

Các hàm cũng có thể thực hiện các công việc tính toán và cho ra kết quả chứ không đơn giản chỉ các thực hiện các công việc như println!().

Khi muốn một hàm cho ra kết quả nào thì chúng ta phải thêm kí tự -> <kiểu dữ liệu> sau tên hàm, và hàm sẽ cho ra kết quả là biểu thức cuối cùng có trong hàm đó, lưu ý biểu thức cuối cùng không được có dấu chấm phẩy. Ví dụ:

fn main() { 
    let n: i32 = 8; 
    println!("n * n = {}", power(n));
}

fn power(n: i32) -> i32 { 
    n * n
}

Trong đoạn code trên chúng ta khai báo hàm power() nhận vào một tham số có tên là n, có kiểu dữ liệu là i32, hàm này cho ra kết quả là một giá trị có kiểu dữ liệu i32 vì chúng ta đã khai báo -> i32, bên trong hàm có một câu biểu thức là n*n, và hàm này sẽ cho ra kết quả là giá trị của biểu thức n*n này.

Trong hàm main() chúng ta khai báo một biến n có giá trị là 8 và chúng ta truyền vào hàm power() biến n này, hàm power() sẽ cho ra kết quả là 64. Lưu ý là biến n trong hàm main() và tham số n trong hàm power() là 2 biến khác nhau mặc dù chúng trùng tên.

n * n = 64

Trong trường hợp chúng ta muốn trả về giá trị không phải ở cuối hàm thì chúng ta phải dùng câu lệnh return, phía sau câu lệnh return là một giá trị hoặc một câu lệnh, hoặc biểu thức có trả về giá trị. Ví dụ:

fn main() { 
    let n: i32 = 1_234_567_890; 
    println!("{}", power(n));
}

fn power(n: i32) -> i32 { 
    if n >= 1_000_000_000 { 
        println!("n is too big"); 
        return -1; 
    } 
    n * n
}

Trong đoạn code trên chúng ta viết lại hàm power(), ở đây chúng ta kiểm tra xem nếu n lớn hơn 1 tỉ thì in ra một dòng thông báo và cho trả về kết quả là -1.

n is too big
-1

Hàm lồng nhau

Chúng ta cũng có thể định nghĩa một hàm bên trong một hàm khác, và các hàm đó được gọi là nested function – tức hàm lồng nhau. Ví dụ:

fn main() { 
    outer_fn();
}

fn outer_fn() { 
    println!("Enter outer_fn()"); 
    nested_fn(); 

    fn nested_fn() { 
        println!("Enter nested_fn()"); 
    }
}
Enter outer_fn()
Enter nested_fn()
Được đăng vào ngày 06/10/2017