อาร์กิวเมนต์จำนวนแปรผันและตัวดำเนินการ ...
จัดการรายการอาร์กิวเมนต์ที่มีความยาวแปรผันด้วย ... และ select()
อาร์กิวเมนต์จำนวนแปรผันและตัวดำเนินการ ... เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
อาร์กิวเมนต์จำนวนแปรผัน
ฟังก์ชัน Lua สามารถรับอาร์กิวเมนต์จำนวนเท่าใดก็ได้โดยใช้ ... (จุดสามจุด) ในรายการพารามิเตอร์ ภายในฟังก์ชัน ... แทนอาร์กิวเมนต์ส่วนเกิน คุณสามารถใช้ในนิพจน์ ส่งต่อให้ฟังก์ชันอื่น หรือแปลงเป็นตารางได้
local function sum(...)
local total = 0
for _, v in ipairs({...}) do
total = total + v
end
return total
end
print(sum(1, 2, 3)) -- 6
print(sum(10, 20, 30, 40)) -- 100select() สำหรับอาร์กิวเมนต์แปรผัน
select(n, ...) คืนอาร์กิวเมนต์ตั้งแต่ตำแหน่ง n เป็นต้นไป ส่วน select("#", ...) คืนจำนวนอาร์กิวเมนต์ทั้งหมด รวมค่า nil ด้วย วิธีนี้ปลอดภัยกว่า #{...} ซึ่งหยุดเมื่อพบช่องว่าง nil แรก
local function inspect(...)
local n = select("#", ...)
print("count:", n)
for i = 1, n do
print(i, select(i, ...))
end
end
inspect("a", "b", nil, "d")
-- count: 4
-- 1 a
-- 2 b
-- 3 nil
-- 4 dการส่ง ... ไปยังฟังก์ชันอื่น
คุณสามารถส่งต่ออาร์กิวเมนต์แปรผันไปยังฟังก์ชันอื่นโดยตรงด้วย f(...) เมื่อ ... อยู่เป็นอาร์กิวเมนต์สุดท้ายในการเรียก อาร์กิวเมนต์แปรผันทั้งหมดจะถูกส่งต่อ วิธีนี้มีประโยชน์สำหรับการห่อหุ้มฟังก์ชันหรือการบันทึกข้อมูล
local function log(level, ...)
io.write("[" .. level .. "] ")
print(...)
end
log("INFO", "Server started on port", 8080)
log("ERROR", "File not found:", "config.lua")
-- [INFO] Server started on port 8080
-- [ERROR] File not found: config.luatable.pack และ table.unpack
แปลงอาร์กิวเมนต์แปรผันเป็นตารางด้วย table.pack(...) ซึ่งจะเก็บจำนวนไว้ในฟิลด์ n ด้วย แปลงตารางกลับเป็นอาร์กิวเมนต์แปรผันด้วย table.unpack(t, i, j) เมื่อใช้ร่วมกัน ฟังก์ชันเหล่านี้ช่วยให้คุณควบคุมรายการอาร์กิวเมนต์ที่มีจำนวนเปลี่ยนแปลงได้อย่างเต็มที่
local function pack_and_show(...)
local packed = table.pack(...)
print("n =", packed.n)
for i = 1, packed.n do
print(i, packed[i])
end
end
pack_and_show(10, nil, 30)
-- n = 3
-- 1 10
-- 2 nil
-- 3 30อาร์กิวเมนต์คงที่และแปรผสมกัน
ฟังก์ชันสามารถมีทั้งพารามิเตอร์คงที่และพารามิเตอร์แปรผันได้ พารามิเตอร์คงที่จะอยู่ก่อน ส่วน ... จะจับอาร์กิวเมนต์ที่เหลือ พารามิเตอร์คงที่จะถูกกำหนดค่าก่อน จากนั้นอาร์กิวเมนต์ที่เหลือจึงถูกใส่ไว้ใน ...
local function printf(fmt, ...)
io.write(string.format(fmt, ...))
end
printf("Hello, %s! You are %d years old.\n", "Alice", 30)
printf("Pi is approximately %.4f\n", math.pi)
local function firstAndRest(first, ...)
print("first:", first)
print("rest count:", select("#", ...))
end
firstAndRest(1, 2, 3, 4)อาร์กิวเมนต์แปรผันในตัวสร้างตาราง
คุณสามารถกระจายอาร์กิวเมนต์แปรผันลงในตัวสร้างตารางได้โดยตรง: {...} เมื่อใช้เป็นสมาชิกสุดท้าย อาร์กิวเมนต์ทั้งหมดจะถูกรวมไว้ อย่างไรก็ตาม ช่องว่างที่เป็น nil อาจทำให้ # ให้ผลสับสน — หากต้องการจำนวนที่แน่นอน ควรใช้ table.pack
local function toArray(...)
return {...} -- collect all args as array
end
local arr = toArray("x", "y", "z")
for i, v in ipairs(arr) do
print(i, v)
end
-- 1 x
-- 2 y
-- 3 zนิพจน์อาร์กิวเมนต์แปรผัน
... สามารถอยู่ในตำแหน่งใดก็ได้ของนิพจน์ ในการกำหนดค่าหลายตัวแปร จะขยายเป็นค่าทั้งหมด ส่วนในนิพจน์เลขคณิต จะใช้เพียงค่าแรก การเข้าใจพฤติกรรมนี้ช่วยป้องกันข้อผิดพลาดที่สังเกตได้ยากเมื่อใช้ ... ร่วมกับนิพจน์อื่น
local function first(...)
local x = ...
return x
end
print(first(10, 20, 30)) -- 10 (only first)
local function addFirst(n, ...)
local x = ...
return n + x
end
print(addFirst(5, 3, 99)) -- 8 (3 is first ...)print() ใช้อาร์กิวเมนต์แปรผัน
print() ในตัวของ Lua เองก็เป็นฟังก์ชันที่รับอาร์กิวเมนต์แปรผัน โดยรับอาร์กิวเมนต์จำนวนเท่าใดก็ได้ แปลงแต่ละค่าเป็นสตริง และคั่นด้วยแท็บ การเข้าใจเรื่องนี้ช่วยให้คุณเขียนฟังก์ชันอรรถประโยชน์ในลักษณะเดียวกันได้
-- print is vararg
print(1, 2, 3) -- 1 2 3
print("a", nil, "b") -- a nil b
print() -- (empty line)
-- Reimplementing a simple print-like function
local function myprint(...)
local parts = {}
for i = 1, select("#", ...) do
parts[i] = tostring(select(i, ...))
end
io.write(table.concat(parts, "\t") .. "\n")
end
myprint(10, nil, 30)การส่งต่อด้วย pcall
ผสาน pcall กับอาร์กิวเมนต์แปรผันเพื่อสร้างตัวห่อหุ้มการเรียกอย่างปลอดภัยทั่วไป ตัวห่อหุ้มนี้รับฟังก์ชันและอาร์กิวเมนต์ใด ๆ เรียกฟังก์ชันผ่าน pcall แล้วคืนผลลัพธ์หรือข้อผิดพลาด
local function safeCall(fn, ...)
local ok, result = pcall(fn, ...)
if ok then
return result
else
print("Error:", result)
return nil
end
end
local function divide(a, b)
assert(b ~= 0, "division by zero")
return a / b
end
print(safeCall(divide, 10, 2)) -- 5.0
print(safeCall(divide, 10, 0)) -- Error: ...รูปแบบการสะสมอาร์กิวเมนต์แปรผัน
รูปแบบทั่วไปของอาร์กิวเมนต์แปรผันคือวนซ้ำผ่านอาร์กิวเมนต์ทั้งหมดแล้วสะสมผลลัพธ์ สามารถทำได้โดยใช้ตารางเฉพาะที่ หรือบวกค่าโดยตรงด้วย select ทั้งสองแนวทางใช้ได้ แต่แนวทางที่ใช้ตารางจะอ่านง่ายกว่าเมื่อมีอาร์กิวเมนต์จำนวนมาก
local function average(...)
local n = select("#", ...)
if n == 0 then return 0 end
local total = 0
for i = 1, n do
total = total + select(i, ...)
end
return total / n
end
print(average(10, 20, 30, 40)) -- 25.0
print(average(5)) -- 5.0ตรวจสอบอย่างรวดเร็ว
select("#", 1, nil, 3) คืนค่าอะไร
ทบทวน: อาร์กิวเมนต์แปรผัน
สรุป:
function f(...)— รับอาร์กิวเมนต์จำนวนแปรผันselect("#", ...)— นับจำนวนอย่างปลอดภัย รวมค่า nilselect(n, ...)— คืนค่าตั้งแต่ตำแหน่ง ntable.pack(...)— แปลงอาร์กิวเมนต์แปรผันเป็นตารางพร้อมจำนวนใน .ntable.unpack(t)— แปลงตารางเป็นอาร์กิวเมนต์แปรผัน...ในตำแหน่งสุดท้ายจะขยายทั้งหมด ส่วนตำแหน่งกลางจะให้ค่าเดียว
คำถามที่พบบ่อย
บทเรียน “อาร์กิวเมนต์จำนวนแปรผันและตัวดำเนินการ ...” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “อาร์กิวเมนต์จำนวนแปรผันและตัวดำเนินการ ...” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “อาร์กิวเมนต์จำนวนแปรผันและตัวดำเนินการ ...”
จัดการรายการอาร์กิวเมนต์ที่มีความยาวแปรผันด้วย ... และ select() คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “อาร์กิวเมนต์จำนวนแปรผันและตัวดำเนินการ ...” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม
ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การกำหนดและเรียกใช้ฟังก์ชัน
- ค่าที่ส่งคืนหลายค่า
- อาร์กิวเมนต์จำนวนแปรผันและตัวดำเนินการ ...
- การเรียกซ้ำใน Lua