การประกาศตัวแปรใน Lua
ทำความเข้าใจตัวแปร global กับ local และหลักการตั้งชื่อ
การประกาศตัวแปรใน Lua เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
ตัวแปรส่วนกลางเทียบกับตัวแปรเฉพาะที่
ใน Lua ตัวแปรจะเป็น ตัวแปรส่วนกลางโดยค่าเริ่มต้น การเขียน x = 10 โดยไม่ใช้คีย์เวิร์ด local จะสร้างตัวแปรส่วนกลางที่เข้าถึงได้จากทุกที่ การใช้ local x = 10 จะจำกัดตัวแปรไว้ในบล็อกปัจจุบันและบล็อกซ้อนภายใน
ควรใช้ local เป็นหลักเพื่อประสิทธิภาพและความปลอดภัย การเข้าถึงตัวแปรเฉพาะที่เร็วกว่าตัวแปรส่วนกลาง เนื่องจากตัวแปรส่วนกลางต้องค้นหาในตารางแฮชของตาราง _G
x = 100 -- global variable
local y = 200 -- local variable
do
local z = 300 -- block-local
print(x, y, z) -- 100 200 300
end
print(x, y) -- 100 200
print(z) -- nil (out of scope)คีย์เวิร์ด local
คีย์เวิร์ด local ใช้ประกาศตัวแปรที่มีขอบเขตอยู่ในบล็อกครอบที่ใกล้ที่สุด ได้แก่ เนื้อหาฟังก์ชัน บล็อก do...end เนื้อหาลูป หรือส่วนของไฟล์ ตัวแปรเฉพาะที่จะถูกสร้างขึ้นที่บรรทัดที่ประกาศ และจะหมดอายุเมื่อจบบล็อก
คุณสามารถประกาศตัวแปรเฉพาะที่หลายตัวในบรรทัดเดียวและกำหนดค่าเริ่มต้นให้พร้อมกันได้ ตัวแปรเฉพาะที่ที่ยังไม่ได้กำหนดค่าจะมีค่าเริ่มต้นเป็น nil
local a, b, c = 1, 2, 3
print(a, b, c) -- 1 2 3
local d, e = 10 -- e is nil
print(d, e) -- 10 nil
local f -- nil until assigned
f = 42
print(f) -- 42หลักการตั้งชื่อตัวแปร
ตัวระบุของ Lua มีกฎดังนี้: ต้องขึ้นต้นด้วยตัวอักษรหรือขีดล่าง ตามด้วยตัวอักษร ตัวเลข หรือขีดล่าง Lua แยกแยะตัวพิมพ์เล็กใหญ่ ดังนั้น Value, value และ VALUE จึงเป็นตัวแปรสามตัวที่แตกต่างกัน
ตามธรรมเนียม ให้ใช้ camelCase หรือ snake_case สำหรับตัวแปรทั่วไป ใช้ UPPER_CASE สำหรับค่าคงที่ และเติมขีดล่างหน้าฟิลด์ส่วนตัวของโมดูล หลีกเลี่ยงชื่ออักษรตัวเดียว ยกเว้นตัวนับลูป
local myVariable = 1 -- camelCase
local my_variable = 2 -- snake_case
local MAX_SIZE = 100 -- constant convention
local _private = "hidden" -- private convention
-- Case sensitivity demo
local lua = "lower"
local Lua = "upper"
print(lua, Lua) -- lower upperตารางส่วนกลาง _G
ตัวแปรส่วนกลางทั้งหมดใน Lua อยู่ในตารางพิเศษที่ชื่อ _G การเขียน x = 10 มีความหมายเทียบเท่ากับ _G.x = 10 คุณสามารถตรวจสอบตัวแปรส่วนกลางทั้งหมดได้โดยวนซ้ำผ่าน _G ซึ่งสะดวกสำหรับการแก้ไขข้อบกพร่อง แต่เป็นอันตรายสำหรับโค้ดที่ใช้งานจริง
ใน Lua 5.2 ขึ้นไป _ENV เป็นตารางสภาพแวดล้อมจริง ส่วน _G ถูกตั้งค่าเริ่มต้นให้ชี้ไปยังตารางนั้น ความเข้าใจนี้ช่วยให้คุณสร้างแซนด์บ็อกซ์ให้โค้ดได้ด้วยการแทนที่ _ENV
myGlobal = 42
print(_G.myGlobal) -- 42
-- Setting via _G is the same as direct assignment
_G.another = "hello"
print(another) -- hello
-- Counting globals (many built-ins exist)
local count = 0
for k in pairs(_G) do count = count + 1 end
print("Globals:", count)การกำหนดค่าหลายตัว
Lua รองรับ การกำหนดค่าหลายตัว: คุณสามารถกำหนดค่าให้ตัวแปรหลายตัวในคำสั่งเดียว ระบบจะประเมินด้านขวาก่อน แล้วจึงกำหนดค่าจากซ้ายไปขวา หากมีตัวแปรมากกว่าค่า ตัวแปรส่วนเกินจะได้รับ nil หากมีค่ามากกว่าตัวแปร ค่าส่วนเกินจะถูกทิ้ง
คุณจึงสลับค่าตัวแปรได้ง่ายโดยไม่ต้องใช้ตัวแปรชั่วคราว
-- Swap without temp variable
local a, b = 10, 20
a, b = b, a
print(a, b) -- 20 10
-- More variables than values
local x, y, z = 1, 2
print(x, y, z) -- 1 2 nil
-- More values than variables
local p, q = 1, 2, 3 -- 3 is discarded
print(p, q) -- 1 2ขอบเขตและขอบเขตของบล็อก
ตัวกำหนดขอบเขตบล็อกของ Lua ได้แก่ do...end, เนื้อหาฟังก์ชัน, if/elseif/else...end, while...end, repeat...until และ for...end แต่ละแบบจะสร้างระดับขอบเขตใหม่ บล็อก do...end มีประโยชน์สำหรับจำกัดขอบเขตโดยเฉพาะ โดยไม่ต้องมีตรรกะอื่น
ตัวแปรเฉพาะที่ประกาศในส่วนหัวของลูป for จะมีขอบเขตอยู่ในเนื้อหาลูป และจะไม่รั่วไหลออกไปภายนอก
for i = 1, 3 do
local msg = "item " .. i
print(msg)
end
-- print(i) -- would be nil, i is gone
-- print(msg) -- would be nil, msg is gone
-- do...end for manual scoping
do
local temp = expensive_computation or 0
print(temp)
end
-- temp is nil hereค่าคงที่: ธรรมเนียมการใช้ local
Lua ไม่มีคีย์เวิร์ด const ในตัว ธรรมเนียมคือใช้ชื่อแบบ UPPER_CASE ร่วมกับ local เพื่อสื่อว่าค่าไม่ควรเปลี่ยน การวางค่าคงที่ไว้ด้านบนของโมดูลในรูปตัวแปรเฉพาะที่ยังช่วยบอกใบ้ให้คอมไพเลอร์ JIT ทราบว่าค่าเหล่านี้คงที่
หากต้องการความไม่เปลี่ยนแปลงอย่างแท้จริง คุณสามารถใช้ตารางพร็อกซีที่มี __newindex ซึ่งทำให้เกิดข้อผิดพลาดเมื่อมีการแก้ไข — เราจะกล่าวถึงเรื่องนี้ในบทเรียนเมตาตาราง
local MAX_RETRIES = 3
local PI = 3.14159265358979
local APP_VERSION = "1.0.0"
-- Use them as read-only by convention
local area = PI * 5 * 5
print(area) -- 78.539...
print(MAX_RETRIES) -- 3การบดบังตัวแปร
การบดบังตัวแปร เกิดขึ้นเมื่อขอบเขตภายในประกาศตัวแปรเฉพาะที่โดยใช้ชื่อเดียวกับตัวแปรในขอบเขตภายนอก การประกาศภายในจะสร้างตัวแปรใหม่ทั้งหมด ซึ่งบดบังตัวแปรภายนอกภายในขอบเขตของตน ตัวแปรภายนอกจะไม่เปลี่ยนแปลง และจะกลับมามองเห็นได้เมื่อจบขอบเขตภายใน
การบดบังตัวแปรอาจทำให้สับสน ควรใช้ชื่อที่ไม่ซ้ำกันในขอบเขตที่ซ้อนกัน แต่บางครั้งก็เป็นความตั้งใจ เช่น การใช้ชื่อตัวแปรลูปซ้ำในลูปซ้อนกัน
local x = "outer"
do
local x = "inner" -- shadows outer x
print(x) -- inner
end
print(x) -- outer (unchanged)
local n = 10
for n = 1, 3 do -- loop n shadows outer n
print(n) -- 1, 2, 3
end
print(n) -- 10 (outer unchanged)หลีกเลี่ยงการทำให้ส่วนกลางปนเปื้อน
ตัวแปรส่วนกลางที่เกิดขึ้นโดยไม่ตั้งใจเป็นข้อผิดพลาดที่พบบ่อยใน Lua: การพิมพ์ชื่อตัวแปรเฉพาะที่ผิดจะสร้างตัวแปรส่วนกลางใหม่โดยไม่มีการแจ้งเตือน โมดูล strict.lua ซึ่งมักรวมอยู่ในโครงการ จะตรวจจับการอ่านและเขียนตัวแปรส่วนกลางที่ไม่ได้ประกาศด้วยการเพิ่มเมตาตารางให้กับ _G
วิธีที่ง่ายกว่าคือใช้ local เสมอ และเรียกใช้ luac -p หรือเครื่องมือตรวจโค้ดอย่าง luacheck เพื่อตรวจหาตัวแปรส่วนกลางที่เกิดขึ้นโดยไม่ตั้งใจก่อนรันโปรแกรม
-- Dangerous: typo creates a global silently
local counter = 0
coutner = 5 -- typo! creates global 'coutner'
print(counter) -- 0 (not 5!)
print(coutner) -- 5 (the typo global)
-- Fix: always use local keyword
local score = 0
score = 10 -- assigns to existing local
print(score) -- 10การกำหนด nil จะลบตัวแปรส่วนกลาง
การกำหนด nil ให้ตัวแปรส่วนกลางจะลบตัวแปรนั้นออกจาก _G และคืนหน่วยความจำ วิธีนี้เป็นวิธีที่ถูกต้องในการ "ลบ" ตัวแปรส่วนกลาง สำหรับตัวแปรเฉพาะที่ เพียงปล่อยให้ตัวแปรพ้นขอบเขตก็ได้ผลเช่นเดียวกัน — ตัวเก็บขยะจะเรียกคืนหน่วยความจำ
โปรดระวังเมื่อส่ง nil ในการกำหนดค่าหลายตัว เพราะอาจทำให้รายการอาร์กิวเมนต์สั้นลงในบางบริบท โดยเฉพาะเมื่อด้านขวามีการเรียกฟังก์ชัน
myGlobal = "exists"
print(myGlobal) -- exists
print(_G.myGlobal ~= nil) -- true
myGlobal = nil
print(myGlobal) -- nil
print(_G.myGlobal ~= nil) -- false
-- The entry is removed from _Gตรวจสอบอย่างรวดเร็ว
ตัวแปรที่ประกาศด้วย local x = 5 ภายในเนื้อหาลูป for มีขอบเขตอยู่ที่ใด
สรุป: การประกาศตัวแปรใน Lua
ประเด็นสำคัญจากบทเรียนนี้:
- ตัวแปรเป็น ตัวแปรส่วนกลางโดยค่าเริ่มต้น — ให้ใช้
localเสมอ - ตัวแปรเฉพาะที่ทำงานเร็วกว่า (ไม่ต้องค้นหาในตารางแฮช) และปลอดภัยกว่า
- การกำหนดค่าหลายตัว:
a, b = b, aใช้สลับค่าได้ในบรรทัดเดียว - ตัวแปรส่วนกลางทั้งหมดอยู่ใน
_G; การกำหนดเป็นnilจะลบตัวแปรเหล่านั้น - การบดบังตัวแปร:
localภายในจะบดบังตัวแปรภายนอกโดยไม่เปลี่ยนค่าเดิม - ตามธรรมเนียม ให้ใช้
UPPER_CASEสำหรับค่าคงที่
ถัดไป: ตัวดำเนินการเลขคณิต ความสัมพันธ์ และตรรกะ
คำถามที่พบบ่อย
บทเรียน “การประกาศตัวแปรใน Lua” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การประกาศตัวแปรใน Lua” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การประกาศตัวแปรใน Lua”
ทำความเข้าใจตัวแปร global กับ local และหลักการตั้งชื่อ คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การประกาศตัวแปรใน Lua” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม
ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ภาพรวมชนิดข้อมูลของ Lua
- การประกาศตัวแปรใน Lua
- ตัวดำเนินการเลขคณิตและความสัมพันธ์
- การบังคับและการแปลงชนิดข้อมูล