Bỏ qua để đến nội dung

If...else trong Rust

if cho phép chương trình của bạn đưa ra quyết định — chạy khối code này hay khối code kia, tùy vào một điều kiện.

fn main() {
let age = 20;
if age >= 18 {
println!("Bạn được đi bầu cử");
}
}
▶ Tự chạy thử

Có vài điều cần để ý, vì chúng hay làm người đến từ ngôn ngữ khác vấp phải:

  • Không cần dấu ngoặc quanh điều kiện — viết if age >= 18, không phải if (age >= 18).
  • Điều kiện phải là một bool thật sự. if age (một con số) sẽ không biên dịch được — bạn cần if age != 0 hoặc tương tự.
fn main() {
let age = 15;
if age >= 18 {
println!("Bạn được đi bầu cử");
} else {
println!("Bạn chưa đủ tuổi");
}
}
▶ Tự chạy thử
fn main() {
let score = 72;
if score >= 90 {
println!("Xếp loại: A");
} else if score >= 75 {
println!("Xếp loại: B");
} else if score >= 60 {
println!("Xếp loại: C");
} else {
println!("Xếp loại: F");
}
}
▶ Tự chạy thử

Rust kiểm tra từng điều kiện từ trên xuống dưới và chạy nhánh đầu tiên khớp, đúng như bạn nghĩ.

Đây là điều Rust làm được mà nhiều ngôn ngữ không làm được: if có thể tạo ra một giá trị. Nghĩa là bạn có thể dùng nó ở vế phải của một let:

fn main() {
let age = 20;
let status = if age >= 18 { "người lớn" } else { "trẻ vị thành niên" };
println!("{status}");
}
▶ Tự chạy thử

Cách này hoạt động giống như việc trả về giá trị từ một hàm — không có dấu chấm phẩy sau giá trị ở mỗi nhánh. Yêu cầu duy nhất: cả hai nhánh phải tạo ra cùng một kiểu (ở đây cả hai đều là &str).

Bạn có thể đặt một if bên trong một if khác. Cách đó chạy được, nhưng lồng hai ba tầng thì sẽ khó đọc. Thường thì bạn có thể nối các điều kiện bằng toán tử logic && (và) và || (hoặc):

fn main() {
let temperature = 22;
let is_raining = false;
// Lồng nhau: chạy được, nhưng code cứ trôi dần sang phải
if temperature > 15 {
if !is_raining {
println!("Lồng nhau: đi dạo thôi");
}
}
// Cùng phép kiểm tra đó, viết thành một điều kiện
if temperature > 15 && !is_raining {
println!("Kết hợp: đi dạo thôi");
}
// || đúng nếu một trong hai vế đúng
if temperature < 0 || temperature > 35 {
println!("Ở trong nhà thôi");
} else {
println!("Thời tiết ổn");
}
}

Kết quả:

Lồng nhau: đi dạo thôi
Kết hợp: đi dạo thôi
Thời tiết ổn
▶ Tự chạy thử

Lồng nhau vẫn hợp lý khi khối bên trong làm thêm việc gì đó, hoặc khi nó có else riêng. Nhưng khi if bên ngoài chỉ có mỗi nhiệm vụ canh gác cho if bên trong, thì && nói cùng một điều mà đơn giản hơn. Để kiểm tra một số có nằm trong một khoảng hay không, hãy viết temperature >= 15 && temperature <= 25. Rust không cho phép 15 <= temperature <= 25.

Lưu một số n = 7. Dùng if như một biểu thức để gán cho biến kind giá trị "chẵn" hoặc "lẻ", rồi in ra 7 là số lẻ. Gợi ý: một số là số chẵn khi n % 2 == 0.

Xem lời giải
fn main() {
let n = 7;
let kind = if n % 2 == 0 { "chẵn" } else { "lẻ" };
println!("{n} là số {kind}");
}

Kết quả:

7 là số lẻ
▶ Tự chạy thử

Một rạp chiếu phim lấy 5 đô cho trẻ em dưới 12 tuổi, 7 đô cho người từ 65 tuổi trở lên, và 12 đô cho mọi người còn lại. Lưu age là 70, tính price bằng một biểu thức if / else if / else, rồi in ra Vé: $7. Gợi ý: nhánh nào cũng phải trả lại một con số, và cả khối if kết thúc bằng dấu chấm phẩy sau dấu } cuối cùng.

Xem lời giải
fn main() {
let age = 70;
let price = if age < 12 {
5
} else if age >= 65 {
7
} else {
12
};
println!("Vé: ${price}");
}

Kết quả:

Vé: $7
▶ Tự chạy thử
  • if điều_kiện { ... } — không cần dấu ngoặc; điều kiện phải là một bool.
  • Nối thêm các phép kiểm tra bằng else if, và dùng else cho trường hợp còn lại.
  • Nối các điều kiện bằng && và || thay vì lồng if trong if.
  • if có thể được dùng như một biểu thức để tạo ra giá trị — hai nhánh phải cùng kiểu, và bạn cần có else.

Kiểm tra nhanh

1. Điều nào là bắt buộc với điều kiện của if trong Rust?

2. Khi dùng if như một biểu thức với let, cả hai nhánh phải thỏa điều gì?

Điểm: 0 / 2