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

Upvalue ร่วมระหว่างคลอเชอร์

เรียนรู้การที่คลอเชอร์หลายตัวใช้ upvalue เดียวกันและผลจากการเปลี่ยนค่า

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

การใช้อัปแวลูเดียวกันร่วมกัน

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

local function makeGetterSetter()
  local value = 0
  local function get() return value end
  local function set(v) value = v end
  return get, set
end
local get, set = makeGetterSetter()
set(42)
print(get())  -- 42

เหตุผลที่มีการใช้ร่วมกัน

Lua ไม่ได้ทำสำเนาอัปแวลูแยกให้แต่ละคลอเชอร์ คลอเชอร์ทั้งหมดที่สร้างในบล็อกเดียวกันและชี้ไปยังตัวแปรเฉพาะที่เดียวกัน จะใช้เซลล์อัปแวลูเดียวกัน

รูปแบบผู้สังเกตการณ์ผ่านอัปแวลูร่วม

อัปแวลูร่วมสามารถทำหน้าที่เป็นช่องทางส่งข้อความระหว่างคลอเชอร์หลายตัวได้

local count = 0
local inc = function() count = count + 1 end
local dec = function() count = count - 1 end
local get = function() return count end
inc(); inc(); dec()
print(get())  -- 1

ข้อควรระวังเกี่ยวกับตัวแปรในลูป

ในลูป numeric for แต่ละรอบจะสร้างตัวแปรลูปเฉพาะที่ตัวใหม่ ดังนั้นคลอเชอร์จึงจับอัปแวลูที่แยกจากกัน

local fns = {}
for i = 1, 3 do
  fns[i] = function() return i end
end
print(fns[1](), fns[2](), fns[3]())  -- 1 2 3 (each closure has its own i)

ข้อควรระวังเกี่ยวกับตัวแปรในลูป while

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

local fns = {}
local i = 0
while i < 3 do
  i = i + 1
  fns[i] = function() return i end  -- all share same i!
end
print(fns[1]())  -- 3 (not 1!)

การจับตัวแปรเฉพาะที่ตัวใหม่

หากต้องการจับค่าแยกจากกันในลูป while ให้ประกาศตัวแปรเฉพาะที่ตัวใหม่ภายในส่วนตัวลูป

local fns = {}
local i = 0
while i < 3 do
  i = i + 1
  local ci = i  -- new local per iteration
  fns[i] = function() return ci end
end
print(fns[1]())  -- 1, fns[2]() == 2

รูปแบบโมดูลที่ใช้สถานะร่วมกัน

โมดูลสามารถเปิดเผยฟังก์ชันหลายตัวที่ใช้ตารางสถานะส่วนตัวร่วมกันผ่านอัปแวลูได้

local function makeStack()
  local data = {}
  return {
    push = function(v) data[#data+1] = v end,
    pop  = function() local v = data[#data]; data[#data]=nil; return v end,
    size = function() return #data end,
  }
end

การใช้นามแฝงและการเปลี่ยนค่า

โปรดระวัง: คลอเชอร์ทั้งหมดที่อ้างอิงอัปแวลูเดียวกันจะเห็นการเปลี่ยนค่าเดียวกันทันที วิธีนี้มีประโยชน์มาก แต่อาจทำให้ส่วนต่าง ๆ ผูกโยงกันโดยไม่ตั้งใจ

เอกลักษณ์ของอัปแวลู

debug.upvalueid(f, n) ส่งคืนเอกลักษณ์เฉพาะของอัปแวลูลำดับที่ n ของฟังก์ชัน f คลอเชอร์สองตัวที่มี ID ของอัปแวลูเดียวกันจะใช้เซลล์เดียวกัน

debug.upvaluejoin

debug.upvaluejoin(f1, n1, f2, n2) ทำให้อัปแวลูลำดับที่ n1 ของ f1 ใช้เซลล์เดียวกับอัปแวลูลำดับที่ n2 ของ f2 เป็นเครื่องมือระดับล่างสำหรับการแก้จุดบกพร่อง

รูปแบบการใช้งานจริง

  • คู่ฟังก์ชันอ่านค่า/กำหนดค่าที่ใช้ตัวแปรส่วนตัวร่วมกัน
  • ตัวนับเหตุการณ์ที่มีการรีเซ็ตและเปิดเผยผ่านคลอเชอร์หลายตัว
  • สถานะของโมดูลที่ใช้ร่วมกันในฟังก์ชันส่วนติดต่อโปรแกรมหลายตัว

คำถามเกี่ยวกับอัปแวลูร่วม

คลอเชอร์สองตัว get และ set ถูกสร้างในขอบเขตเดียวกัน โดยทั้งคู่จับ value ไว้ หากเรียก set(99) แล้ว get() จะส่งคืนอะไร

สรุป: อัปแวลูร่วม

คลอเชอร์ในขอบเขตเดียวกันจะใช้เซลล์อัปแวลูร่วมกัน การเปลี่ยนแปลงจะปรากฏแก่คลอเชอร์ทั้งหมดที่ใช้ร่วมกันทันที นี่คือพื้นฐานของการห่อหุ้มและสถานะโมดูลใน Lua

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

บทเรียน “Upvalue ร่วมระหว่างคลอเชอร์” ฟรีหรือไม่

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

คุณจะเรียนรู้อะไรในบทเรียน “Upvalue ร่วมระหว่างคลอเชอร์”

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

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

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

บทเรียน “Upvalue ร่วมระหว่างคลอเชอร์” ใช้เวลานานแค่ไหน

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

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

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

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

  1. Upvalue คืออะไร
  2. Upvalue ร่วมระหว่างคลอเชอร์
  3. ฟังก์ชันโรงงานและตัวสร้างลำดับ
  4. การจดจำผลลัพธ์ด้วยคลอเชอร์
← กลับไปที่ Lua Academy