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

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

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

  1. ภาพรวมชนิดข้อมูลของ Lua
  2. การประกาศตัวแปรใน Lua
  3. ตัวดำเนินการเลขคณิตและความสัมพันธ์
  4. การบังคับและการแปลงชนิดข้อมูล
← กลับไปที่ Lua Academy