ตัวทำลายด้วย __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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ