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

Smart Pointer

pointer คือแนวคิดทั่วไปสำหรับตัวแปรที่บรรจุ address ใน memory address นี้อ้างถึง หรือ “ชี้ที่” ข้อมูลอื่น ประเภท pointer ที่ทั่วไปที่สุดใน Rust คือ reference ซึ่งคุณเรียนในบทที่ 4 reference ถูกระบุด้วย สัญลักษณ์ & และ borrow ค่าที่พวกมันชี้ พวกมันไม่มีความสามารถพิเศษ ใด ๆ นอกจากการอ้างถึงข้อมูล และพวกมันไม่มี overhead

Smart pointer ในทางตรงข้าม คือโครงสร้างข้อมูลที่ทำตัวเหมือน pointer แต่ยังมี metadata เพิ่มและความสามารถ แนวคิดของ smart pointer ไม่ unique กับ Rust — smart pointer มีต้นกำเนิดใน C++ และมีอยู่ในภาษาอื่น ด้วย Rust มี smart pointer ที่หลากหลายนิยามใน standard library ที่ ให้ functionality นอกเหนือที่ reference ให้ เพื่อสำรวจแนวคิดทั่วไป เราจะดูตัวอย่างต่าง ๆ ของ smart pointer รวมถึงประเภท smart pointer แบบ reference counting pointer นี้อนุญาตให้คุณให้ข้อมูลมีหลาย owner โดยตามจำนวน owner และเมื่อไม่มี owner เหลือ ทำความสะอาดข้อมูล

ใน Rust ด้วยแนวคิดของ ownership และ borrowing มีความแตกต่างเพิ่ม ระหว่าง reference และ smart pointer — ในขณะที่ reference เพียง borrow ข้อมูล ในหลายกรณี smart pointer own ข้อมูลที่พวกมันชี้

Smart pointer มักถูก implement โดยใช้ struct ต่างจาก struct ปกติ smart pointer implement trait Deref และ Drop trait Deref อนุญาตให้ instance ของ struct smart pointer ทำตัวเหมือน reference เพื่อให้คุณเขียนโค้ดของคุณทำงานกับ reference หรือ smart pointer trait Drop อนุญาตให้คุณกำหนดโค้ดที่รันเมื่อ instance ของ smart pointer ออกจาก scope ในบทนี้ เราจะพูดถึงทั้งสอง trait และสาธิตทำไม พวกมันสำคัญต่อ smart pointer

เนื่องจาก pattern smart pointer เป็น design pattern ทั่วไปที่ใช้ บ่อยใน Rust บทนี้จะไม่ครอบคลุม smart pointer ที่มีอยู่ทุกตัว หลาย library มี smart pointer ของตัวเอง และคุณยังเขียนของตัวเองได้ เรา จะครอบคลุม smart pointer ที่ใช้บ่อยที่สุดใน standard library:

  • Box<T> สำหรับ allocate ค่าบน heap
  • Rc<T> ประเภท reference counting ที่อนุญาตให้มี ownership หลาย
  • Ref<T> และ RefMut<T> ที่เข้าถึงผ่าน RefCell<T> ประเภทที่ บังคับใช้กฎ borrowing ที่ runtime แทน compile time

นอกจากนี้ เราจะครอบคลุม pattern interior mutability ที่ประเภท immutable expose API สำหรับ mutate ค่าภายใน เรายังจะพูดถึง reference cycle — ว่าพวกมันรั่ว memory ได้ยังไงและวิธีป้องกัน

มาดำดิ่งกัน!