แบบฝึกหัด: บทที่ 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