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.
Khai báo một boolean
Phần tiêu đề “Khai báo một boolean”fn main() { let is_active = true; let has_error: bool = false; println!("đang hoạt động: {is_active}, có lỗi: {has_error}");}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.
Boolean thường đến từ phép so sánh
Phần tiêu đề “Boolean thường đến từ phép so sánh”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ử: trueDùng boolean trong điều kiện
Phần tiêu đề “Dùng boolean trong điều kiện”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.
Kết hợp boolean và cơ chế dừng sớm
Phần tiêu đề “Kết hợp boolean và cơ chế dừng sớm”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ếualàfalsethì cả biểu thức chắc chắn làfalse, nên Rust không bao giờ xem đếnb. - Với
a || b, nếualàtruethì cả biểu thức chắc chắn làtrue, nên Rust không bao giờ xem đếnb.
Đó 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: trueChia 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.
Luyện tập
Phần tiêu đề “Luyện tập”1. Có được chơi không?
Phần tiêu đề “1. Có được chơi không?”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: true2. Năm nhuận
Phần tiêu đề “2. Năm nhuận”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: true1900 là năm nhuận: falseTóm tắt
Phần tiêu đề “Tóm tắt”boolchứa đúng hai giá trị:truehoặcfalse.- Phép so sánh (
==,<,>=, …) tạo ra boolean. - Điều kiện trong
ifphải là mộtboolthậ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
Phần tiêu đề “Kiểm tra nhanh”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
Đọc thêm
Phần tiêu đề “Đọc thêm”- The Boolean Type — The Rust Book (tiếng Anh): phần giới thiệu ngắn chính thức về
bool, bên cạnh các kiểu cơ bản khác. bool— standard library docs (tiếng Anh): mọi phương thức củabool, nhưthenvàthen_some, cho lúc bạn sẵn sàng.- Lazy boolean operators — The Rust Reference (tiếng Anh): quy tắc chính xác về cách
&&và||bỏ qua vế phải. - Primitives — Rust by Example (tiếng Anh):
boolbên cạnh các kiểu có sẵn khác của Rust, kèm một ví dụ chạy được.