Rust – Rẽ nhánh và vòng lặp


Được đăng vào ngày 03/10/2017 | 0 bình luận

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-elseif-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, forloop. 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'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 nn^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

Được đăng vào ngày 03/10/2017