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

อาร์กิวเมนต์จำนวนแปรผันและตัวดำเนินการ ...

จัดการรายการอาร์กิวเมนต์ที่มีความยาวแปรผันด้วย ... และ 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)) -- 100

select() สำหรับอาร์กิวเมนต์แปรผัน

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.lua

table.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("#", ...) — นับจำนวนอย่างปลอดภัย รวมค่า nil
  • select(n, ...) — คืนค่าตั้งแต่ตำแหน่ง n
  • table.pack(...) — แปลงอาร์กิวเมนต์แปรผันเป็นตารางพร้อมจำนวนใน .n
  • table.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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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