0Pricing
Lua Academy · บทเรียน

ตัวทำลายด้วย __gc

ลงทะเบียนเมทาเมธอด __gc เพื่อทำความสะอาดเมื่อมีการเก็บออบเจกต์

ตัวทำลายด้วย __gc เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

ตัวทำลายขั้นสุดท้ายคืออะไร

ตัวทำลายขั้นสุดท้ายคือฟังก์ชันที่ตัวเก็บขยะเรียกก่อนคืนหน่วยความจำของออบเจ็กต์ ใน Lua ฟังก์ชันนี้ทำงานผ่านเมทาเมธอด __gc ในเมทาตารางของตาราง

การกำหนดตัวทำลายขั้นสุดท้าย

เชื่อมฟังก์ชัน __gc เข้ากับเมทาตารางก่อนหรือขณะที่สร้างออบเจ็กต์

local mt = {
  __gc = function(self)
    print("Finalizing:", self.name)
  end
}
do
  local obj = setmetatable({name = "resource"}, mt)
end
collectgarbage()  -- prints: Finalizing: resource

รูปแบบการล้างทรัพยากร

ตัวทำลายขั้นสุดท้ายเหมาะอย่างยิ่งสำหรับคืนทรัพยากรภายนอก เช่น ตัวจัดการไฟล์ การเชื่อมต่อฐานข้อมูล หรือหน่วยความจำ C

local function openResource(path)
  local f = io.open(path, "r")
  return setmetatable({handle = f, path = path}, {
    __gc = function(self)
      if self.handle then
        self.handle:close()
        print("Closed:", self.path)
      end
    end
  })
end

ลำดับตัวทำลายขั้นสุดท้าย

ออบเจ็กต์ที่มีตัวทำลายขั้นสุดท้ายจะถูกเก็บตามลำดับย้อนกลับจากลำดับการสร้าง โดยค่าเริ่มต้น ตัวทำลายขั้นสุดท้ายจะทำงานหนึ่งรายการต่อรอบการเก็บขยะ

การคืนชีพของออบเจ็กต์

หากตัวทำลายขั้นสุดท้ายเก็บการอ้างอิงไปยังออบเจ็กต์ (ในตัวแปรโกลบอลหรืออัปแวลู) ออบเจ็กต์นั้นจะถูกคืนชีพ และจะได้รับการเรียกตัวทำลายขั้นสุดท้ายอีกเพียงครั้งเดียวเมื่อถูกเก็บในที่สุด

ยูสเซอร์ดาตาและ __gc

ในส่วนขยาย C การใช้ __gc กับยูสเซอร์ดาตาเป็นวิธีหลักในการคืนหน่วยความจำ C สำหรับโค้ด Lua ล้วน ตารางใช้กลไกเดียวกันผ่านเมทาตาราง

ออบเจ็กต์ตัวแทนสำหรับ RAII

สร้างตารางตัวแทนที่มี __gc สำหรับปิดทรัพยากรจริง วิธีนี้เลียนแบบ RAII จาก C++

local function scoped(resource, cleanup)
  return setmetatable({resource}, {
    __gc = function(self) cleanup(self[1]) end
  })
end

ข้อจำกัดของตัวทำลาย

ตัวทำลายไม่ควรทำสิ่งต่อไปนี้: เรียกใช้การทำงานของโครูทีน, หยุดพักการทำงาน หรือสมมติว่าวัตถุอื่น ๆ ยังมีชีวิตอยู่ตามลำดับใดลำดับหนึ่ง ควรทำให้ตัวทำลายเรียบง่ายและทำงานสั้น ๆ

ตารางแบบอ่อนและตัวทำลาย

วัตถุในตารางแบบอ่อนยังคงถูกเรียกใช้ตัวทำลายได้ หลังจากการทำลาย (และอาจมีการทำให้วัตุกลับมามีชีวิตอีกครั้ง) วัตถุเหล่านั้นจะถูกเก็บคืนอย่างสมบูรณ์ในรอบถัดไป

ตัวป้องกันตัวทำลายของ toLua

ใช้แฟล็กบูลีนภายในตัวทำลายเพื่อป้องกันการล้างข้อมูลซ้ำ ในกรณีที่วัตถุกลับมามีชีวิตอีกครั้ง

local mt = {}
mt.__gc = function(self)
  if not self._closed then
    self._closed = true
    -- cleanup...
  end
end

คำแนะนำเชิงปฏิบัติ

ควรใช้เมธอด :close() หรือ :destroy() อย่างชัดเจนเพื่อให้การล้างทรัพยากรเกิดขึ้นอย่างแน่นอน ใช้ __gc เป็นตาข่ายนิรภัยสำหรับกรณีลืมล้างทรัพยากร ไม่ใช่กลไกหลักในการจัดการทรัพยากร

คำถามเกี่ยวกับตัวทำลาย

เมธอดเมตา __gc ถูกเรียกใช้เมื่อใด

ทบทวน: ตัวทำลายด้วย __gc

เมธอดเมตา __gc จะทำงานก่อนที่วัตถุจะถูกเก็บคืน ทำให้สามารถล้างทรัพยากรในรูปแบบ RAII ได้ ใช้เป็นตาข่ายนิรภัย และควรใช้เมธอด close/destroy อย่างชัดเจนเพื่อให้การจัดการทรัพยากรเกิดขึ้นอย่างแน่นอน

คำถามที่พบบ่อย

บทเรียน “ตัวทำลายด้วย __gc” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ตัวทำลายด้วย __gc” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ตัวทำลายด้วย __gc”

ลงทะเบียนเมทาเมธอด __gc เพื่อทำความสะอาดเมื่อมีการเก็บออบเจกต์ คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “ตัวทำลายด้วย __gc” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม

ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. พื้นฐานตัวเก็บขยะของ Lua
  2. คีย์อ่อนและค่าอ่อน
  3. ตัวทำลายด้วย __gc
  4. การหลีกเลี่ยงหน่วยความจำรั่ว
← กลับไปที่ Lua Academy