การจัดการเกี่ยวกับ 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