Tour of Rust - Ch.2 - Basic Control Flow

Published on

เขียนวันที่ : April 12, 2022

tour-of-rust/chapter2

บททึกการเรียน Tour Of Rust บทเรียนที่ 2 - Tour of Rust - Chapter 2 - Basic Control Flow

Chapter 2 - Basic Control Flow 🦀

If/Else

  • condition ไม่ต้องใส่วงเล็บ (มีแอบขิงด้วยว่า looks nice and clean 🤣)
  • condition ใน Rust ต้องเป็น bool มันจะไม่แปลงเป็น boolean type ให้แบบ JavaScript เราต้องกำหนดให้เป็น boolean เช่น
fn main() {
    let x = 42;
    // แบบนี้ไม่ได้
    if x {}

    if x < 42 {
        println!("less than 42");
    } else if x == 42 {
        println!("is 42");
    } else {
        println!("greater than 42");
    }
}
  • logic operators ใช้ได้หมด ==, !=, <, >, <=, >=, !, ||, &&
  • If ใน let statement ก็ทำได้ แบบนี้
fn main() {
    let condition = true;
    let number = if condition { 5 } else { 6 };
}
  • ใน statment ต้องเป็น type เดียวกันด้วยนะ ทั้ง if และ else แบบข้างล่างนี้ไม่ได้
fn main() {
    let condition = true;
    let number = if condition { 5 } else { "six" };
}

Loop

  • loop แบบ infinity
fn main() {
    loop {
        println!("again!");
    }
}
  • ใช้ loop สำหรับ infinity loop จนกว่าเราจะกดหยุดโปรแกรม (Ctrl + C) หรือใช้ break
fn main() {
    let mut x = 0;
    loop {
        x += 1;
        if x == 42 {
            break;
        }
    }
    println!("{}", x);
}

While

while loop ก็คล้ายๆ ภาษาอื่นๆ กำหนด condition ถ้า condition เป็น false ก็จบการทำงาน ถ้า true ก็ทำงานใน loop

fn main() {
    let mut x = 0;
    while x != 42 {
        x += 1;
    }
    println!("x is {}", x);
}

For

  • Loop ใน Rust สามารถวันลูปซ้ำๆ ได้กับ Iterator ใดๆก็ได้
  • Iterator คือไรหว่า อธิบายไงดี เป็น object / collection ที่เราสามารถเข้าถึง item ข้างในได้ พวก map
  • สร้าง iterator จาก range ตัวเลข 0..5 คือ Iterator ที่มี 0,1,2,3,4
  • .. - สร้าง iterator ตั้งแต่เลข 0 - 5 แต่ไม่รวม 5 เช่น 0..5
  • ..= - สร้าง iterator ตั้งแต่ 0 - 5 (รวม เลขหลัง) เช่น 0..=5

Match

  • เวอร์ชั่น upgrade ของ If / Else If statement
  • match จะจับคู่เงื่อนไขที่เป็นไปได้ทั้งหมด
  • match เราต้องตรวจสอบ condition ให้ครอบคลุมให้หมด
  • มักเจอพร้อมกับ destructuring
  • อ่านอาจจะไม่เห็นภาพ ถ้าดูตัวอย่างโค๊ดน่าจะเข้าใจง่ายกว่า
  • match เป็นได้ทั้ง expression (มี comma) และ block (ไม่มี comma)
fn main() {
    let x = 42;

    match x {
        0 => {
            println!("found zero");
        }
        // match ทั้ง 1 และ 2
        1 | 2 => {
            println!("found 1 or 2!");
        }
        // match แบบ range ก็ได้
        3..=9 => {
            println!("found a number 3 to 9 inclusively");
        }
        // bind ใส่ตัวแปรก็ได้ด้วย
        matched_num @ 10..=100 => {
            println!("found {} number between 10 to 100!", matched_num);
        }
        // default match เอาไว้ดักทุกเคส คล้ายๆ switch case default
        _ => {
            println!("found something else!");
        }
    }
}
  • ถ้ามอง syntax แบบนี้จะดูง่ายขึ้นมั้ยนะ
let result = match value {
    value_to_match => { ... },
    value_to_match => { ... },
    value_to_match => { ... },
    _ => { ... }
};

โจทย์ classic ถ้าใครไม่เข้าใจ match ลองทำโจทย์พวกนับเกรดที่ใช้ if/else มาใช้ match ดู ถ้าเขียนโปรแกรมมาก่อน น่าจะไม่ยากนะ ez 🤣

Returning Value from loop

  • ใน loop เราใช้ break เพื่อ return ค่าได้เหมือนกัน
fn main() {
    let mut x = 0;
    let v = loop {
        x += 1;
        if x == 13 {
            break "found the 13";
        }
    };
    println!("from loop: {}", v);
}

Returning Values From Block Expressions

  • If แบบ let statement จริงๆ ย่อๆ แบบ ternary expression ก็ได้ แบบนี้
let v = if x < 42 { -1 } else { 1 };
  • ถ้า function หรือ expression ไม่มี ; ต่อท้าย มันจะ return ค่า จาก block
let result = match food {
    "hotdog" => "is hotdog",
    // ไม่ต้องมี {} ก็ได้
    _ => "is not hotdog",
};
  • ซึ่งเทียบเท่ากับ (ไม่ต้องมี ;)
_ => {
    "is not hotdog"
}
  • เวลา return ค่า ใน function จะต้องเจอ บรรทัดสุดท้าย ที่ไม่มี semicolon (;) นั่นแหละครับ เดี๋ยวจะเข้าใจเอง

สรุป บทที่ 2

บทนี้เริ่มยากขึ้นมาหน่อย มี loop ที่อาจจะไม่ค่อยชิน ปกติใช้ for หรือ while ต้องกำหนด condition เลย แต่อันนี้ ใช้ loop แล้วไป break เอา ส่วนเรื่อง match คิดว่าน่าจะใช้และเจอบ่อยมาก สำหรับบทนี้เหมือนเป็นบทนำ แนะนำเบื้องต้นเท่านั้น และส่วน return ค่า เวลาไม่ใส่ ; แรกๆ ผมก็ไม่ชิน สายตา ชอบมองไม่ออก ว่าอันไหนใส่ ; หรือไม่ใส่

อ่านเพิ่มเติม

Discord