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

Kiểu Boolean trong Rust

Boolean là kiểu đơn giản nhất: nó chỉ có thể là true (đúng) hoặc false (sai). Trong Rust nó tên là bool, và bạn sẽ dùng nó ở mọi nơi cần đưa ra quyết định trong code.

fn main() {
let is_active = true;
let has_error: bool = false;
println!("đang hoạt động: {is_active}, có lỗi: {has_error}");
}
▶ Tự chạy thử

Rust gần như luôn tự suy ra bool từ true/false, nên bạn hiếm khi cần ghi kiểu ra một cách tường minh.

Trong code thực tế, bạn ít khi viết thẳng true hay false — chúng thường là kết quả của việc so sánh một thứ gì đó:

fn main() {
let age = 20;
let can_vote = age >= 18;
println!("Được đi bầu cử: {can_vote}");
}

Kết quả:

Được đi bầu cử: true
▶ Tự chạy thử

Nhiệm vụ chính của một bool là quyết định nhánh nào của if sẽ chạy:

fn main() {
let is_raining = true;
if is_raining {
println!("Mang theo ô nhé");
} else {
println!("Cứ để ô ở nhà");
}
}

Chúng ta sẽ học kỹ về if ở bài If…else — đây chỉ là nếm thử để thấy vì sao boolean quan trọng.

Bạn đã gặp && (và), || (hoặc) và ! (không) ở bài Toán tử. Có một điều nữa cần biết về chúng: chúng dừng sớm khi câu trả lời đã được quyết định. Điều này gọi là đánh giá ngắn mạch (short-circuit evaluation).

  • Với a && b, nếu a là false thì cả biểu thức chắc chắn là false, nên Rust không bao giờ xem đến b.
  • Với a || b, nếu a là true thì cả biểu thức chắc chắn là true, nên Rust không bao giờ xem đến b.

Đó không chỉ là mẹo tăng tốc. Nó cho phép vế trái bảo vệ vế phải:

fn main() {
let count = 0;
let total = 50;
// count bằng 0, nên Rust dừng sau `count != 0` và không bao giờ thực hiện phép chia.
let big_average = count != 0 && total / count > 10;
println!("trung bình lớn: {big_average}");
let is_weekend = true;
let has_homework = true;
// is_weekend là true, nên `!has_homework` không bao giờ được kiểm tra.
let can_relax = is_weekend || !has_homework;
println!("được nghỉ ngơi: {can_relax}");
}

Kết quả:

trung bình lớn: false
được nghỉ ngơi: true
▶ Tự chạy thử

Chia cho 0 sẽ làm chương trình sập. Vì count != 0 đứng trước và có giá trị false, phép chia đơn giản là không bao giờ chạy. Nếu đổi chỗ hai vế (total / count > 10 && count != 0), phép chia sẽ chạy trước. Ở đây trình biên dịch còn phát hiện ra và từ chối build (“this operation will panic at runtime”, tức là thao tác này sẽ panic khi chạy); còn với một giá trị chỉ có được trong lúc chương trình chạy, chương trình sẽ sập. Vì vậy hãy đặt “bước kiểm tra an toàn” ở bên trái.

Một trò chơi ở công viên cho bạn lên nếu bạn cao ít nhất 120 cm, hoặc nếu bạn ít nhất 8 tuổi và đi cùng người lớn. Lưu chiều cao 115, tuổi 9 và with_adult = true, rồi in ra xem bạn nhỏ này có được chơi không. Gợi ý: dùng dấu ngoặc để nhóm phần “tuổi và người lớn”.

Xem lời giải
fn main() {
let height_cm = 115;
let age = 9;
let with_adult = true;
let tall_enough = height_cm >= 120;
let can_ride = tall_enough || (age >= 8 && with_adult);
println!("đủ chiều cao: {tall_enough}");
println!("được chơi: {can_ride}");
}

Kết quả:

đủ chiều cao: false
được chơi: true
▶ Tự chạy thử

Một năm là năm nhuận nếu nó chia hết cho 4 nhưng không chia hết cho 100, hoặc nếu nó chia hết cho 400. Tính một boolean is_leap cho năm 2024, in ra, rồi làm tương tự với năm 1900. Gợi ý: “chia hết cho 4” là year % 4 == 0, và bạn có thể shadow year và is_leap bằng một let thứ hai.

Xem lời giải
fn main() {
let year = 2024;
let is_leap = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
println!("{year} là năm nhuận: {is_leap}");
let year = 1900;
let is_leap = (year % 4 == 0 && year % 100 != 0) || year % 400 == 0;
println!("{year} là năm nhuận: {is_leap}");
}

Kết quả:

2024 là năm nhuận: true
1900 là năm nhuận: false
▶ Tự chạy thử
  • bool chứa đúng hai giá trị: true hoặc false.
  • Phép so sánh (==, <, >=, …) tạo ra boolean.
  • Điều kiện trong if phải là một bool thật sự — không có chuyển đổi ngầm từ số hay chuỗi.
  • && và || dừng sớm: chúng bỏ qua vế phải khi đã biết câu trả lời, nên hãy đặt bước kiểm tra an toàn ở bên trái.

Kiểm tra nhanh

1. Một phép so sánh như age >= 18 tạo ra kiểu gì?

2. Trong Rust, bạn có thể dùng trực tiếp một số nguyên như 0 làm điều kiện trong if, giống như ở một số ngôn ngữ khác không?

3. Trong count != 0 && total / count > 10, chuyện gì xảy ra khi count bằng 0?

Điểm: 0 / 3