การจัดการเกี่ยวกับ control flow นั้น จะมีอยู่ด้วยกัน 2 ประเภทนั่น คือ if condition และ loop
IF Condition
สำหรับ if
ผมจะสรุปมันอย่างรวดเร็ว เพราะมันไม่ได้มีอะไรที่แตกต่างจากภาษาอื่นๆ เพียงแค่ไม่มี ()
เท่านั้น
fn main() {
let x = 5;
if x == 5 {
println!("x is five!");
} else if x == 6 {
println!("x is six!");
} else {
println!("x is not five or six :(");
}
}
if-else condition
ทั่งนี้เราสามารถใช้ if
ใน Let
ได้เหมือนกัน
fn main() {
let condition = true;
let number = if condition { 5 } else { 6 };
println!("The value of number is: {number}");
}
if in let statement
Loop
ในภาษา Rust มี loop อยู่ 3 แบบ คือ loop, while และ for มาลองกันทีละอัน
Loop
loop
ในภาษา Rust นั้น จะทำงานไปเรื่อยๆ จนกว่าเราจะบอกให้มันหยุด การประกาศเป็นแบบนี้
fn main() {
loop {
println!("again!");
}
}
basic loops (Infinite Loops)
ถ้าลอง run โค๊ดด้านบน มันจะ print again!
ไปเรื่อยๆ จนกว่าเราจะสั่งให้มันหยุดทำงานเอง
ถ้าเราต้องต้องการให้ loop ทำงานตามจำนวนที่ต้องการ จะใช้คำสั่ง break
เพื่อออกจาก loop
fn main() {
let mut counter = 0;
loop {
counter += 1;
if counter == 10 {
break;
}
}
println!("counter: {}", counter);
}
break loops
ทีนี้ ถ้าเราอยาก return value ออกจาก loop เราสามารถเขียนได้แบบนี้
fn main() {
let mut counter = 0;
let result = loop {
counter += 1;
if counter == 10 {
break counter * 2;
}
};
println!("The result is {result}");
}
return value from loops
สังเกตว่า เราจะประกาศตัวแปร let result =
ไว้ก่อนหน้า loop เพื่อรับค่าที่ถูก return กลับมา
Loop within Loop
ในกรณีที่เรามีการใช้งาน loop มากกว่าหนึ่ง loop หรือเรียกง่ายๆ ว่า loop ซ้อน loop การใช้ break
อาจจะทำให้สับสนได้ว่า มัน break
ตัวไหน ดังนั้นใน Rust จึงแก้ปัญหานี้ด้วย การเพิ่ม Label
ให้แก่ loop เพื่อให้เราสามารถสั่ง break
ได้ถูกตัว
โดยการใช้งาน Label
นั้น เราจะประกาศ 'ชื่อ Label:
ไว้ก่อนหน้า Loop และมีจุดที่ต้องจำไว้อีกอย่างเลย คือ มันมี '
อยู่หน้าชื่อ Label ที่ประกาศ
ส่วนการใช้งาน เราก็เพิ่มชื่อ 'ชื่อ Label
ไว้หลัง break
ตามตัวอย่างด้านล่าง
fn main() {
let mut count = 0;
'counting_up: loop {
println!("count = {count}");
let mut remaining = 10;
loop {
println!("remaining = {remaining}");
if remaining == 9 {
break;
}
if count == 2 {
break 'counting_up;
}
remaining -= 1;
}
count += 1;
}
println!("End count = {count}");
}
Loop Label
ตามตัวอย่างจะเห็นว่า เรามี break
อยู่ 2 จุด โดย break
แรกนั้นจะเป็นการออกจาก loop ในสุด และ break 'counting_up;
จะเป็นการออกจาก loop นอกสุดนั่นเอง
While loop
ในการใช้งาน loop นั้น เราเลี่ยงไม่ได้ที่จะต้องมีการกำหนดเงื่อนไขในการทำงานของมัน ซึ่งคำสั่งที่เราคุ้นเคยในการใช้งาน คือ คำสั่ง while
ซึ่งมันจะทำงานจนกว่า เงื่อนไขจะเป็นจริง
fn main() {
let mut number = 3;
while number != 0 {
println!("{number}!");
number -= 1;
}
println!("LIFTOFF!!!");
}
While loops
อีกตัวอย่างนึง ถ้าหากมี collection ของข้อมูลอย่าง เช่น array เราก็สามารถเรียกใช้งานได้ดังนี้
fn main() {
let a = [10, 20, 30, 40, 50];
let mut index = 0;
while index < 5 {
println!("the value is: {}", a[index]);
index += 1;
}
}
collection with for
แต่ในกรณีนี้จริงๆ แล้วเราสามารถใช้งานคำสั่งอีกตัวได้เช่นกัน
For
จากโค๊ดด้านบน หากข้อมูลที่เราต้องการวน loop อยู่ในรูปแบบของ collection เราสามารถใช้งานคำสั่ง for
ได้ด้วยเช่นกัน ซึ่งมันสะดวก กระชับ และปลอดภัย กว่าการใช้ `while
fn main() {
let a = [10, 20, 30, 40, 50];
for element in a {
println!("the value is: {element}");
}
}
For loops
ถ้าหากว่าเราต้องการที่จะวน loop for จากหลังมาหน้า ให้เราใช้คำสั่ง .rev()
ด้วย แบบนี้
fn main() {
for number in (1..4).rev() {
println!("{number}!");
}
println!("LIFTOFF!!!");
}
countdown for loop