การอ้างถึง (Reference)
การใช้ References ทำให้เราสามารถเข้าถึงข้อมูลได้โดยที่ไม่ต้องเป็นเจ้าของข้อมูลนั้นก่อน
- '&' ampersands คือเครื่องหมายการอ้างถึงข้อมูล
- การใช้เครื่องหมาย '&' ทำให้เราสามารถเข้าถึงข้อมูลได้โดยไม่ต้องเปลี่ยนเจ้าของมาเป็นเรา
ตัวอย่าง
let s = String::from("data");
println!(&s);
s ยังคงเป็นเจ้าของข้อมูล "data" อยู่ ฟังก์ชั่น println แค่ขอยืมการเข้าถึงข้อมูลนั้นเพื่อทำการปริ้น หลังจาก println ทำงานเสร็จ s ก็กลับมาถือครองข้อมูล "data" ดังเดิม
- ฟังก์ชัน println จะสามารถอ้างถึง ข้อมูล "data" ได้ตราบเท่าที่พารามิเตอร์ของฟังก์ชัน println ชีวิตอยู่
การยืม (Borrowing)
การยืมใช้สำหรับการขอสิทธิเข้าถึงข้อมูลดังตัวอย่างด้านบน
หากเราต้องการยืมด้วย และมีสิทธิในการแก้ไขด้วย ต้องใช้การยืม แบบ &mut s
ทั้งนี้ s ต้องประกาศเป็น mut ถึงจะสามารถทำได้
fn main(){
let mut s = String::from("data");
print(&mut s); // ยืมแบบสามารถแก้ไขข้อมูล "data" ได้ด้วย
println!("in main: {}", s);
}
fn print(n: &mut String) {
println!("in print : {}", n);
n.push_str(" change here");
}
ผลลัพท์
in print : data
in main: data change here
โปรแกรมสามารถยืมได้แค่ทีละตัวแปร ไม่สามารถยืมได้พร้อมกันหลายตัวแปรได้ถ้าหากมันเป็น mut คือข้อมูลที่สามารถเปลี่ยนแปลงได้ ตามกฎ