ค่าที่ส่งคืนหลายค่า
ส่งคืนและรับค่าหลายค่าจากการเรียกฟังก์ชันครั้งเดียว
ค่าที่ส่งคืนหลายค่า เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
การคืนค่าหลายค่า
ต่างจากภาษาส่วนใหญ่ ฟังก์ชัน Lua สามารถคืนค่าหลายค่าจากคำสั่ง return เดียวได้โดยตรง ค่าหลายค่าจะคั่นด้วยจุลภาคหลัง return จึงไม่จำเป็นต้องใช้วัตถุห่อหุ้มหรือพารามิเตอร์ผลลัพธ์
local function divmod(a, b)
return math.floor(a / b), a % b
end
local quotient, remainder = divmod(17, 5)
print(quotient, remainder) -- 3 2การปรับค่าที่คืนกลับ
Lua ปรับค่าที่คืนกลับให้ตรงกับจำนวนตัวรับ ค่าที่เกินจะถูกทิ้ง ส่วนค่าที่ขาดจะกลายเป็น nil การปรับนี้เกิดขึ้นทุกครั้งที่การเรียกฟังก์ชันไม่ใช่นิพจน์ สุดท้ายในรายการ — หากอยู่ในตำแหน่งนั้น จะเก็บไว้เฉพาะค่าแรก
local function triple()
return 10, 20, 30
end
local a, b, c = triple()
print(a, b, c) -- 10 20 30
local x, y = triple()
print(x, y) -- 10 20 (30 discarded)
local p = triple()
print(p) -- 10 (only first when 1 var)การปรับในตำแหน่งกลาง
เมื่อการเรียกฟังก์ชันอยู่ในตำแหน่งกลางของรายการนิพจน์ (ไม่ใช่ตำแหน่งสุดท้าย) Lua จะตัดให้เหลือค่าเดียว เฉพาะนิพจน์สุดท้ายในรายการเท่านั้นที่สามารถสร้างค่าหลายค่าได้
local function pair()
return 1, 2
end
-- pair() in middle: only 1 value used
local t = {pair(), pair()}
print(#t, t[1], t[2], t[3]) -- 3 1 1 2
-- first pair() gives just 1; last pair() gives 1,2
-- pair() at end: all values used
local t2 = {10, pair()}
print(#t2, t2[1], t2[2], t2[3]) -- 3 10 1 2วงเล็บบังคับให้เหลือค่าเดียว
การครอบการเรียกฟังก์ชันด้วยวงเล็บจะบังคับให้คืนค่าเพียงหนึ่งค่า เหมาะเมื่อคุณต้องการเฉพาะค่าที่คืนกลับค่าแรก ไม่ว่าฟังก์ชันจะสร้างค่ากี่ค่าก็ตาม
local function coords()
return 10, 20, 30
end
print(coords()) -- 10 20 30 (all three)
print((coords())) -- 10 (parentheses: single value only)
local x = (coords())
print(x) -- 10ค่าที่คืนโดย string.find
ฟังก์ชันในไลบรารีมาตรฐานหลายฟังก์ชันใช้การคืนค่าหลายค่า string.find คืนตำแหน่งเริ่มต้นและสิ้นสุดของส่วนที่ตรงกัน (รวมถึงส่วนที่จับได้) ส่วน math.modf คืนส่วนจำนวนเต็มและส่วนเศษ การเข้าใจรูปแบบเหล่านี้ช่วยให้คุณใช้ไลบรารีมาตรฐานได้อย่างคล่องแคล่ว
local s = "hello world"
local start, finish = string.find(s, "world")
print(start, finish) -- 7 11
-- math.modf: integer and fractional parts
local int, frac = math.modf(3.75)
print(int, frac) -- 3 0.75การจับค่าด้วย table.pack
table.pack(...) จับอาร์กิวเมนต์ทั้งหมด (หรือค่าที่คืนผ่าน ...) ไว้ในตาราง ตารางนี้มีฟิลด์ n ซึ่งเก็บจำนวนทั้งหมด รวมค่า nil ด้วย วิธีนี้รักษาจำนวนที่แน่นอนไว้ได้ ต่างจาก # ที่หยุดเมื่อพบช่องว่างแรก
local function getData()
return "Alice", 30, nil, true
end
local t = table.pack(getData())
print(t.n) -- 4
print(t[1]) -- Alice
print(t[2]) -- 30
print(t[3]) -- nil
print(t[4]) -- truetable.unpack สำหรับการกระจายค่า
table.unpack(t, i, j) คืนสมาชิกของตารางเป็นค่าแยกกัน โดยเป็นการทำงานกลับด้านของ table.pack ใช้เพื่อส่งสมาชิกของตารางเป็นอาร์กิวเมนต์ให้ฟังก์ชัน หรือกระจายค่าในคำสั่งคืนค่า
local args = {10, 20, 30}
local function sum3(a, b, c)
return a + b + c
end
print(sum3(table.unpack(args))) -- 60
-- Use in return
local function passThrough(t)
return table.unpack(t)
end
print(passThrough({5, 6, 7})) -- 5 6 7การคืนค่าแบบข้อผิดพลาด
ธรรมเนียมทั่วไปของ Lua คือคืนค่า nil, errorMessage เมื่อการทำงานล้มเหลว และคืนผลลัพธ์เมื่อสำเร็จ ผู้เรียกจะตรวจสอบค่าที่คืนค่าค่าแรก: หากเป็น nil แสดงว่าเกิดข้อผิดพลาด วิธีนี้ช่วยหลีกเลี่ยงข้อยกเว้นในกรณีล้มเหลวที่คาดหมายไว้
local function openConfig(path)
local f = io.open(path, "r")
if not f then
return nil, "cannot open: " .. path
end
local content = f:read("*a")
f:close()
return content
end
local data, err = openConfig("config.lua")
if not data then
print("Error:", err)
endการสลับค่าด้วยการคืนค่าหลายค่า
การคืนค่าหลายค่าช่วยแก้ปัญหาการสลับค่าได้อย่างสง่างาม นิพจน์ด้านขวาจะถูกประเมินก่อนการกำหนดค่า ดังนั้น a, b = b, a จึงสลับค่าได้อย่างถูกต้องโดยไม่ต้องใช้ตัวแปรชั่วคราว
local a, b = 5, 10
print(a, b) -- 5 10
a, b = b, a
print(a, b) -- 10 5
-- Works for three-way rotation too
local x, y, z = 1, 2, 3
x, y, z = z, x, y
print(x, y, z) -- 3 1 2ธรรมเนียมการคืนค่าของ pcall
pcall(f, ...) เองก็ใช้การคืนค่าหลายค่า: ค่าแรกเป็นบูลีน (true เมื่อสำเร็จ และ false เมื่อเกิดข้อผิดพลาด) ส่วนค่าถัดไปเป็นค่าที่ f คืนกลับ หรือเป็นข้อความข้อผิดพลาด ควรตรวจสอบค่าที่คืนค่าค่าแรกเสมอก่อนใช้ค่าที่เหลือ
local function risky(x)
if x < 0 then error("negative input") end
return math.sqrt(x)
end
local ok, result = pcall(risky, 16)
print(ok, result) -- true 4.0
ok, result = pcall(risky, -1)
print(ok, result) -- false input:2: negative inputตรวจสอบอย่างรวดเร็ว
print((string.find("hello", "ll"))) แสดงผลลัพธ์เป็นอะไร
ทบทวน: การคืนค่าหลายค่า
ประเด็นสำคัญ:
- คืนค่าหลายค่า:
return a, b, c - ค่าที่เกินจะถูกทิ้ง ส่วนค่าที่ขาดจะกลายเป็น nil
- การเรียกในตำแหน่งกลางจะถูกตัดให้เหลือ 1 ค่า
(f())บังคับให้เหลือค่า 1 ค่าเท่านั้นtable.pack/table.unpackใช้จัดการรายการค่าที่มีจำนวนเปลี่ยนแปลง- ธรรมเนียม: คืนค่า
nil, errmsgเมื่อล้มเหลว
คำถามที่พบบ่อย
บทเรียน “ค่าที่ส่งคืนหลายค่า” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “ค่าที่ส่งคืนหลายค่า” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “ค่าที่ส่งคืนหลายค่า”
ส่งคืนและรับค่าหลายค่าจากการเรียกฟังก์ชันครั้งเดียว คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “ค่าที่ส่งคืนหลายค่า” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม
ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- การกำหนดและเรียกใช้ฟังก์ชัน
- ค่าที่ส่งคืนหลายค่า
- อาร์กิวเมนต์จำนวนแปรผันและตัวดำเนินการ ...
- การเรียกซ้ำใน Lua