Trong phần này chúng ta sẽ tìm hiểu về cú pháp rẽ nhánh và lặp trong Rust.
Rẽ nhánh
Cú pháp rẽ nhánh là các từ khóa if
, if-else
và if-else if-else
, ví dụ:
fn main() {
let lose: bool = true;
if lose == true {
println!("You lose");
}
let age: i32 = 24;
if age < 18 {
println!("Young");
} else {
println!("Adult");
}
let grade: f32 = 8.2;
if grade >= 8.5 {
println!("Excellent");
} else if grade >= 6.5 {
println!("Good");
} else if grade >= 5.0 {
println!("Avarage");
} else {
println!("Bad");
}
}
Trong đoạn code trên chúng ta sử dụng 3 dạng của câu lệnh if
. Câu lệnh if
là câu lệnh rẽ nhánh, câu lệnh if
sẽ nhận vào một biểu thức và một khối lệnh {}
, nếu biểu thức cho ra kết quả là true
thì đoạn code trong khối lệnh {}
sẽ được thực thi.
You lose Adult Good
Trong câu lệnh if
đầu tiên chúng ta kiểm tra xem biến lose
có bằng giá trị true
hay không, nếu có thì in chuỗi "You lose"
ra. Trong câu lệnh if thứ 2 chúng ta kiểm tra biến age có bé hơn 18 hay không, nếu có thì in chuỗi "Youth"
, từ khóa else
có tác dụng thực thi đoạn code trong trường hợp ngược lại là in chuỗi "Adult"
ra. Nếu có nhiều trường hợp cần kiểm tra thì chúng ta dùng cú pháp if-else if-else else
như trong ví dụ thứ 3.
Trong Rust chúng ta có thể dùng câu lệnh if
để thực hiện việc gán giá trị cho biến như sau:
fn main() {
let age: i32 = 24;
let result =
if age < 18 {
"Young"
} else {
"Adult"
};
println!("You are {}", result);
}
Giá trị được gán sẽ là giá trị của câu lệnh cuối cùng trong khối lệnh, ngoài ra cuối câu lệnh if
phải có dấu chấm phẩy ;
. Tất cả các khối lệnh đều phải trả về giá trị có cùng kiểu dữ liệu (chẳng hạn cùng là số hoặc cùng là chuỗi… không được một số một chuỗi).
You are Adult
Nếu bạn đã từng lập trình C++ hay Java thì bạn có thể dùng cú pháp trên thay cho câu lệnh (?:
)
cũng được:
let result = if age < 18 { "Young" } else { "Adult" };
Vòng lặp
Vòng lặp là câu lệnh thực thi các câu lệnh khác nhiều lần. Rust có 3 câu lệnh lặp là while
, for
và loop
. Ví dụ với while
:
fn main() {
let mut i: i32 = 0;
while i < 10 {
println!("i = {}", i); i = i + 1;
}
}
Sau từ khóa while
là một biểu thức và một khối lệnh, câu lệnh này sẽ liên tục kiểm tra xem biểu thức có trả về giá trị true
hoặc false
, nếu true
thì các câu lệnh trong khối lệnh phía sau sẽ được thực thi, cứ thế cho đến khi biểu thức cho ra kết quả false
thì dừng lại.
i = 0 i = 1 i = 2 i = 3 i = 4 i = 5 i = 6 i = 7 i = 8 i = 9
Trong đoạn code trên chúng ta để ý bên trong khối lệnh có câu lệnh i = i + 1
, nếu không có câu lệnh này thì biến i
sẽ luôn luôn có giá trị là 0 và vòng lặp sẽ chạy mãi không dừng (mà người ta hay gọi là lặp vô tận).
Tuy nhiên bản thân Rust lại có câu lệnh lặp loop
mang ý nghĩa lặp vô tận:
fn main() {
let mut i: i32 = 0;
loop {
i = i + 1;
if i == 1993 {
println!("Continue…");
continue;
}
if i == 2017 {
println!("Break");
break;
}
println!("Increasing…");
}
}
Phía sau từ khóa loop
không có biểu thức nào cả mà chỉ có một khối lệnh và khối lệnh này sẽ được chạy liên tục không bao giờ ngừng. Để có thể dừng vòng lặp này lại thì chúng ta phải dùng đến một câu lệnh có tên là break
, trong ví dụ trên chúng ta cho biến i
tăng dần, đến khi biến này có giá trị là 2017 thì chúng ta dừng bằng câu lệnh break
. Ngoài ra bên trong còn có câu lệnh continue
, khi gặp câu lệnh này thì vòng lặp hiện tại sẽ dừng và chuyển sang vòng lặp tiếp theo, các câu lệnh phía sau continue
sẽ không được thực thi, trong đoạn code trên, số 1993 sẽ không được hiển thị và thay vào đó là chuỗi "Continue..."
vì câu lệnh continue
đã chặn câu lệnh in ở dưới.
i = 1 i = 2 i = 3 ... i = 1991 i = 1992 Continue... i = 1994 i = 1995 ... i = 2015 i = 2016 Break
Chúng ta cũng có thể lồng các câu lệnh loop
vào nhau và đặt tên cho mỗi vòng loop
, khi đặt tên cho loop
thì chúng ta có thể chỉ định câu lệnh break
ngắt vòng loop
nào bằng tên của loop
, ví dụ:
fn main() {
let mut i: i32 = 0;
println!("Start outer loop");
‘outer: loop {
println!("Start inner loop");
‘inner: loop {
i = i + 1;
if i == 5 {
break ‘outer;
}
println!("i = {}", i);
}
}
println!("Exit outer loop!");
}
Trong đoạn code trên chúng ta có 2 vòng loop
lồng nhau và được đặt tên là 'outer
và 'inner
. Cú pháp đặt tên loop
là phải có dấu nháy đơn, sau đó là tên rồi dấu 2 chấm và đến từ khóa loop
. Khi sử dụng break
chúng ta cũng ghi tên loop
giống như lúc đặt tên.
Start outer loop Start inner loop i = 1 i = 2 i = 3 i = 4 Exit outer loop!
Nếu muốn lặp trong một số lần nhất định thì chúng ta sử dụng câu lệnh for-in
như ví dụ sau:
fn main() {
for n in 1..10 {
println!("{}^{} = {}", n, n, n * n);
}
}
Cú pháp như sau:
for <tên biến lặp> in <dãy>
Trong đó tên biến lặp là do chúng ta tự đặt, ở đây chúng ta đặt tên là n
, còn dãy là một kiểu dữ liệu dạng danh sách (chúng ta sẽ tìm hiểu thêm trong các bài sau), ở đây chúng ta ghi 1..10
tức là một dãy số từ 1 đến 10, và vòng lặp for
sẽ lặp 10 lần, mỗi lần lặp thì n
sẽ có giá trị từ 1 đến 10. Bên trong vòng lặp chúng ta in giá trị của n
và n^n
.
1^1 = 1 2^2 = 4 3^3 = 9 4^4 = 16 5^5 = 25 6^6 = 36 7^7 = 49 8^8 = 64 9^9 = 81
Nếu chúng ta không cần đến biến n mà chỉ quan tâm đến số vòng lặp thì có thể đặt tên biến lặp là dấu gạch dưới:
for _ in 1..10