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

คีย์อ่อนและค่าอ่อน

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

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

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