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

ค่าที่ส่งคืนหลายค่า

ส่งคืนและรับค่าหลายค่าจากการเรียกฟังก์ชันครั้งเดียว

ค่าที่ส่งคืนหลายค่า เป็นบทเรียน 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])        -- true

table.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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

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