Chuyển đến nội dung chính
Mô-đun 1 · Bài học 1 trong tổng số 21/14 trong khóa học~10 min
Bài học theo mô-đun (1/2)

Biến và khả năng thay đổi

Trong Rust, việc quản lý biến và bộ nhớ được hướng dẫn bởi hai nguyên tắc cơ bản: an toàn và kiểm soát. Vì lý do này, không giống như nhiều ngôn ngữ lập trình khác, các biến trong Rust không thể thay đổi theo mặc định.

Điều này có nghĩa là một khi giá trị được gán cho một biến thì nó không thể thay đổi được. Nếu bạn cố gắng sửa đổi nó, trình biên dịch sẽ báo lỗi.

Biến bất biến và từ khóa mut

Để khai báo một biến, chúng ta sử dụng từ khóa let:

Rust
let x = 5; // Immutable by default
// x = 6; // ERROR! The compiler will refuse to build this code.

Nếu bạn cần sửa đổi giá trị của một biến, bạn phải làm cho nó có thể thay đổi một cách rõ ràng bằng cách sử dụng từ khóa mut ngay sau let:

Rust
let mut y = 10; // Mutable
println!("Il valore di y e: {}", y);
y = 15; // Valid!
println!("Il valore modificato di y e: {}", y);

Việc sử dụng tiền tố mut sẽ truyền đạt rõ ràng tới trình biên dịch và cho bất kỳ ai đọc mã rằng giá trị sẽ thay đổi trong quá trình thực thi.

Bóng tối

Rust cũng cho phép khái niệm shadowing, tức là việc khai báo lại một biến có cùng tên bằng cách sử dụng lại từ khóa let. Biến mới "che khuất" (hoặc che phủ) biến trước đó:

Rust
let x = 5;
let x = x + 1; // Shadowing: x is now 6
let x = x * 2; // Shadowing: x is now 12

Không giống như mut, tính năng tạo bóng cho phép bạn:

  1. Thay đổi kiểu dữ liệu của biến trong khi vẫn giữ nguyên tên.
  2. Duy trì tính bất biến của biến sau khi biến đổi.
Rust
let spaces = "   "; // Type: &str (string)
let spaces = spaces.len(); // Type: usize (number)

Tính hữu ích của Shadowing và Scopes

Shadowing không bị giới hạn trong cùng một khối; nó có thể được sử dụng trong các khối lồng nhau ({}) để tạm thời ghi đè một giá trị. Khi khối bên trong kết thúc, biến ban đầu sẽ hiển thị lại:

Rust
let x = 5;
{
    let x = x * 2; // Shadowing valid only inside the block
    println!("Value in the inner block: {}", x); // Prints 10
}
println!("Value in the outer block: {}", x); // Prints 5

Cơ chế này cực kỳ an toàn và hiệu quả vì nó diễn ra hoàn toàn tại thời điểm biên dịch, đảm bảo an toàn về kiểu mà không cần bất kỳ chi phí nào về hiệu năng thời gian chạy.


Hãy tự mình thử

tập thể dục#rust.m1.l1.e1
Nỗ lực: 0Đang tải…

Khai báo một biến có thể thay đổi có tên x với giá trị ban đầu là 5. Tiếp theo, thêm 10 vào x và in nó ra màn hình bằng println! vĩ mô.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Khai báo biến bằng `let mut x = 5;`, sau đó tăng nó bằng `x += 10;` (hoặc `x = x + 10;`) và cuối cùng in nó bằng `println!('{}', x);`.

Giải pháp khả dụng sau 3 lần thử

tập thể dục#rust.m1.l1.e2
Nỗ lực: 0Đang tải…

Khai báo một biến bất biến y có giá trị là 10. Đánh bóng y bằng cách khai báo lại với let để nhân giá trị trước đó của nó với 2 và cuối cùng in nó bằng println!.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Use `let y = 10;`, then shadow it by declaring it again with `let y = y * 2;` and finally use `println!` to display it.

Giải pháp khả dụng sau 3 lần thử

tập thể dục#rust.m1.l1.e3
Nỗ lực: 0Đang tải…

Declare an immutable variable named input containing the string value "42". Shadow input by declaring it as an integer of type i32, converting the original value via input.parse::<i32>().unwrap(). Finally, print it using the println! macro.

Đang tải trình chỉnh sửa…
Hiển thị gợi ý

Declare `let input = "42";`, then shadow it with `let input: i32 = input.parse().unwrap();` and print it using `println!("{}", input);`.

Giải pháp khả dụng sau 3 lần thử