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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- Upvalue คืออะไร
- Upvalue ร่วมระหว่างคลอเชอร์
- ฟังก์ชันโรงงานและตัวสร้างลำดับ
- การจดจำผลลัพธ์ด้วยคลอเชอร์