คีย์อ่อนและค่าอ่อน
สร้างตารางอ่อนด้วย __mode='k', 'v' หรือ 'kv' สำหรับโครงสร้างคล้ายแคช
คีย์อ่อนและค่าอ่อน เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
ตารางแบบอ่อนคืออะไร
ตารางแบบอ่อนเก็บการอ้างอิงที่ไม่ขัดขวางการเก็บขยะ ออบเจ็กต์ในตารางแบบอ่อนจึงอาจถูกเก็บได้แม้ว่าตารางจะยังมีอยู่
เมทาเมธอด __mode
กำหนด __mode ในเมทาตารางเพื่อควบคุมความอ่อน: "k" สำหรับคีย์แบบอ่อน, "v" สำหรับค่าแบบอ่อน และ "kv" สำหรับทั้งสองแบบ
local weakValues = setmetatable({}, {__mode = "v"})
local weakKeys = setmetatable({}, {__mode = "k"})ตัวอย่างค่าแบบอ่อน
แคชที่สามารถเก็บค่าได้เมื่อไม่มีการอ้างอิงอื่นเหลืออยู่
local cache = setmetatable({}, {__mode = "v"})
local function getObject(key)
if not cache[key] then
cache[key] = {data = key} -- expensive to create
end
return cache[key]
endหลังการเก็บขยะ ค่าแบบอ่อนจะหายไป
เมื่อการอ้างอิงเดียวที่มีต่อออบเจ็กต์อยู่ในตารางค่าแบบอ่อน ตัวเก็บขยะจะเก็บออบเจ็กต์นั้น และรายการดังกล่าวจะหายไป
local t = setmetatable({}, {__mode = "v"})
do
local obj = {}
t[1] = obj
print(t[1]) -- table: 0x...
end
collectgarbage()
print(t[1]) -- nil (collected)ตัวอย่างคีย์แบบอ่อน
คีย์แบบอ่อนช่วยให้คุณเชื่อมโยงข้อมูลกำกับกับออบเจ็กต์ได้โดยไม่ขัดขวางการเก็บขยะ เมื่อออบเจ็กต์ที่เป็นคีย์ถูกเก็บ รายการนั้นจะถูกลบออก
local meta = setmetatable({}, {__mode = "k"})
local function attachMeta(obj, data)
meta[obj] = data
endรูปแบบการกำกับออบเจ็กต์
กำกับออบเจ็กต์ด้วยข้อมูลเพิ่มเติมโดยใช้ตารางคีย์แบบอ่อน เมื่อออบเจ็กต์ถูกเก็บโดยตัวเก็บขยะ ข้อมูลกำกับจะถูกลบออกโดยอัตโนมัติ
local annotations = setmetatable({}, {__mode = "k"})
annotations[myObj] = {created = os.time(), owner = "Alice"}
print(annotations[myObj].owner)ตารางคีย์และค่าแบบอ่อน
ตาราง "kv" มีทั้งคีย์และค่าแบบอ่อน เฉพาะคีย์ที่ยังอยู่ (มีการอ้างอิงจากที่อื่น) เท่านั้นที่จะทำให้รายการยังคงอยู่
ตารางเอฟีเมอรอน
ใน Lua 5.2 ขึ้นไป ตารางคีย์แบบอ่อนเป็นเอฟีเมอรอน: หากการอ้างอิงค่าเพียงอย่างเดียวมาจากคีย์ ทั้งสองอย่างจะถูกเก็บไปพร้อมกัน วิธีนี้ป้องกันการคงออบเจ็กต์ไว้โดยไม่คาดคิด
รูปแบบแคชด้วยค่าแบบอ่อน
การใช้งานมาตรฐานคือแคชการจำผลลัพธ์ ซึ่งจะปล่อยผลลัพธ์ที่แคชไว้เมื่อจำเป็นต้องใช้หน่วยความจำ โดยไม่ต้องลบรายการด้วยตนเอง
local function weakMemo(fn)
local cache = setmetatable({}, {__mode = "v"})
return function(x)
if not cache[x] then cache[x] = fn(x) end
return cache[x]
end
endข้อจำกัด
ตารางแบบอ่อนไม่สามารถเก็บชนิดพื้นฐาน (ตัวเลข ค่าบูลีน และสตริง) เป็นค่าแบบอ่อนได้ เนื่องจากชนิดเหล่านี้ไม่สามารถถูกเก็บโดยตัวเก็บขยะได้ (สตริงถูกจัดเก็บแบบใช้ออบเจ็กต์ร่วมกัน)
ควรใช้ตารางแบบอ่อนเมื่อใด
- แคชออบเจ็กต์ที่ควรปล่อยหน่วยความจำเมื่อมีภาระสูง
- เชื่อมโยงข้อมูลกำกับกับออบเจ็กต์ภายนอก
- สร้างตารางเก็บออบเจ็กต์ร่วมสำหรับออบเจ็กต์แบบกำหนดเอง
คำถามเกี่ยวกับตารางแบบอ่อน
การกำหนด __mode = "v" ในเมทาตารางทำอะไร
สรุป: คีย์และค่าแบบอ่อน
ตารางแบบอ่อนใช้ __mode = "k", "v" หรือ "kv" เพื่ออนุญาตให้ตัวเก็บขยะเก็บคีย์หรือค่าได้ คุณสมบัตินี้สำคัญต่อแคชที่ใช้หน่วยความจำอย่างปลอดภัยและรูปแบบการกำกับออบเจ็กต์
คำถามที่พบบ่อย
บทเรียน “คีย์อ่อนและค่าอ่อน” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “คีย์อ่อนและค่าอ่อน” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “คีย์อ่อนและค่าอ่อน”
สร้างตารางอ่อนด้วย __mode='k', 'v' หรือ 'kv' สำหรับโครงสร้างคล้ายแคช คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “คีย์อ่อนและค่าอ่อน” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม
ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- พื้นฐานตัวเก็บขยะของ Lua
- คีย์อ่อนและค่าอ่อน
- ตัวทำลายด้วย __gc
- การหลีกเลี่ยงหน่วยความจำรั่ว