Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

แบบฝึกหัด: บทที่ 5 - Ownership

แบบฝึกหัดที่ 1: Move

โค้ดนี้มี error อะไร? แก้ไขให้ทำงานได้

fn main() {
    let s1 = String::from("hello");
    let s2 = s1;
    println!("{}", s1);
}
ดูเฉลย

Error: s1 ถูก move ไป s2 แล้ว

วิธีแก้ 1: ใช้ clone

fn main() {
    let s1 = String::from("hello");
    let s2 = s1.clone();
    println!("{}", s1); // ✅ OK
}

วิธีแก้ 2: ใช้ reference

fn main() {
    let s1 = String::from("hello");
    let s2 = &s1;
    println!("{}", s1); // ✅ OK
}

แบบฝึกหัดที่ 2: Function Ownership

โค้ดนี้มี error อะไร? แก้ไขให้ทำงานได้

fn print_string(s: String) {
    println!("{}", s);
}

fn main() {
    let s = String::from("hello");
    print_string(s);
    println!("{}", s); // Error!
}
ดูเฉลย

Error: s ถูก move เข้า function แล้ว

วิธีแก้: ใช้ reference

fn print_string(s: &String) {  // รับ reference
    println!("{}", s);
}

fn main() {
    let s = String::from("hello");
    print_string(&s);  // ส่ง reference
    println!("{}", s); // ✅ OK
}

แบบฝึกหัดที่ 3: Mutable Reference

เขียน function append_world ที่:

  • รับ mutable reference ของ String
  • เพิ่ม “ World“ ต่อท้าย
ดูเฉลย
fn append_world(s: &mut String) {
    s.push_str(" World");
}

fn main() {
    let mut greeting = String::from("Hello");
    append_world(&mut greeting);
    println!("{}", greeting); // Hello World
}

แบบฝึกหัดที่ 4: Borrowing Rules

โค้ดนี้ถูกหรือผิด? อธิบาย

fn main() {
    let mut s = String::from("hello");

    let r1 = &s;
    let r2 = &s;
    let r3 = &mut s;

    println!("{}, {}, {}", r1, r2, r3);
}
ดูเฉลย

ผิด! ไม่สามารถมี mutable reference พร้อมกับ immutable reference ได้

วิธีแก้:

fn main() {
    let mut s = String::from("hello");

    let r1 = &s;
    let r2 = &s;
    println!("{}, {}", r1, r2);  // ใช้ r1, r2 ก่อน

    let r3 = &mut s;  // แล้วค่อยสร้าง mutable ref
    println!("{}", r3);
}

แบบฝึกหัดที่ 5: Slice

เขียน function first_word ที่:

  • รับ &String
  • Return slice ของคำแรก (ก่อน space แรก)
ดูเฉลย
fn first_word(s: &String) -> &str {
    let bytes = s.as_bytes();

    for (i, &byte) in bytes.iter().enumerate() {
        if byte == b' ' {
            return &s[0..i];
        }
    }

    &s[..]
}

fn main() {
    let s = String::from("Hello World");
    let first = first_word(&s);
    println!("First word: {}", first); // Hello
}

👉 บทที่ 6