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

ฟังก์ชันในฐานะค่า

จัดเก็บและส่งต่อฟังก์ชัน

ฟังก์ชันในฐานะค่า เป็นบทเรียน Lua Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Lua Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

ฟังก์ชันเป็นค่าชั้นหนึ่ง

ใน Lua ฟังก์ชันเป็นค่าชั้นหนึ่ง นั่นหมายความว่าฟังก์ชันเป็นเพียงข้อมูลชนิดหนึ่ง คุณสามารถเก็บไว้ในตัวแปร ส่งต่อให้ฟังก์ชันอื่น คืนค่าออกมา หรือเก็บไว้ในตารางได้

แนวคิดเดียวนี้เป็นพื้นฐานของการเขียนโปรแกรมเชิงฟังก์ชันทั้งหมด เมื่อคุณปฏิบัติต่อฟังก์ชันเหมือนตัวเลขหรือสตริง คุณก็สามารถสร้างเครื่องมือที่ยืดหยุ่นและนำกลับมาใช้ใหม่ได้

เก็บฟังก์ชันไว้ในตัวแปร

ชื่อที่คุณตั้งให้ฟังก์ชัน แท้จริงแล้วเป็นเพียงตัวแปรที่เก็บค่าฟังก์ชันไว้ คุณสามารถกำหนดค่านั้นให้กับตัวแปรอื่นได้อย่างอิสระ

ชื่อทั้งสองด้านล่างอ้างอิงฟังก์ชันพื้นฐานเดียวกัน ดังนั้นการเรียกใช้ชื่อใดชื่อหนึ่งจะทำงานด้วยโค้ดเดียวกัน

local function greet(name)
  return "Hello, " .. name
end

local hi = greet
print(greet("Ada"))
print(hi("Lin"))

ฟังก์ชันไม่ระบุชื่อ

คุณไม่จำเป็นต้องตั้งชื่อเพื่อสร้างฟังก์ชัน ฟังก์ชันไม่ระบุชื่อเขียนด้วยไวยากรณ์ function ... end และใช้โดยตรงเป็นค่าได้

การกำหนดฟังก์ชันหนึ่งให้กับตัวแปร local ก็เหมือนกับการนิยามฟังก์ชันปกติ เพียงเขียนไว้ภายในคำสั่งที่ใช้งาน

local square = function(x)
  return x * x
end

print(square(5))
print(square(9))

ฟังก์ชันเป็นอาร์กิวเมนต์

เนื่องจากฟังก์ชันเป็นค่า คุณจึงส่งฟังก์ชันให้ฟังก์ชันอื่นได้ ฟังก์ชันที่รับฟังก์ชันอื่นเป็นอาร์กิวเมนต์เรียกว่าฟังก์ชันระดับสูง

ในที่นี้ apply ไม่ทราบว่าจะทำงานอะไรจนกว่าคุณจะส่งฟังก์ชันให้เรียกใช้

local function apply(f, x)
  return f(x)
end

local function double(n) return n * 2 end

print(apply(double, 10))
print(apply(function(n) return n + 1 end, 10))

การคืนค่าฟังก์ชัน

ฟังก์ชันสามารถคืนค่าฟังก์ชันอื่นได้ วิธีนี้ช่วยให้คุณสร้างฟังก์ชันตามต้องการ โดยกำหนดค่าจากอาร์กิวเมนต์ที่ส่งเข้าไป

ด้านล่างนี้ multiplier จะสร้างฟังก์ชันใหม่เอี่ยมทุกครั้ง และจดจำตัวคูณที่คุณส่งให้

local function multiplier(factor)
  return function(x)
    return x * factor
  end
end

local triple = multiplier(3)
print(triple(4))
print(multiplier(10)(5))

คลอเชอร์เก็บตัวแปรไว้

เมื่อฟังก์ชันที่คืนค่าออกมาใช้ตัวแปร local จากฟังก์ชันที่ครอบอยู่ ฟังก์ชันนั้นจะเก็บตัวแปรดังกล่าวไว้ คู่ของฟังก์ชันกับตัวแปรที่เก็บไว้นี้เรียกว่าคลอเชอร์

factor ที่ถูกเก็บไว้จะยังคงอยู่ตราบเท่าที่คลอเชอร์ยังอยู่ แม้การเรียกใช้ฟังก์ชันภายนอกจะเสร็จสิ้นแล้ว

local function counter()
  local n = 0
  return function()
    n = n + 1
    return n
  end
end

local next = counter()
print(next())
print(next())
print(next())

ฟังก์ชันในตาราง

ตารางสามารถเก็บฟังก์ชันได้เช่นเดียวกับค่าอื่น ๆ นี่คือวิธีที่ Lua สร้างมอดูลและออบเจ็กต์ โดยตารางจะจับคู่ชื่อกับค่าฟังก์ชัน

คุณสามารถค้นหาฟังก์ชันด้วยคีย์แล้วเรียกใช้ หรือแม้แต่ทำซ้ำผ่านตารางของการดำเนินการต่าง ๆ ได้

local ops = {
  add = function(a, b) return a + b end,
  sub = function(a, b) return a - b end
}

print(ops.add(2, 3))
print(ops["sub"](9, 4))

ตารางกลยุทธ์

การเก็บฟังก์ชันไว้ในตารางช่วยให้คุณเลือกพฤติกรรมขณะทำงานด้วยคีย์ได้ วิธีนี้ใช้แทนสายคำสั่ง if-else ยาว ๆ ด้วยการค้นหาที่อ่านง่าย

การเลือกการดำเนินการด้วยชื่อช่วยให้โค้ดที่เรียกใช้สั้นและขยายเพิ่มคีย์ใหม่ได้ง่าย

local dispatch = {
  upper = string.upper,
  lower = string.lower,
  rev = string.reverse
}

local function run(name, s)
  return dispatch[name](s)
end

print(run("upper", "lua"))
print(run("rev", "lua"))

ฟังก์ชันเรียกกลับ

ฟังก์ชันเรียกกลับคือฟังก์ชันที่คุณส่งให้ระบบเรียกใช้ในภายหลัง ไลบรารีมาตรฐานของ Lua ใช้รูปแบบนี้ เช่น table.sort รับฟังก์ชันเปรียบเทียบ

ฟังก์ชันเรียกกลับเป็นผู้กำหนดกฎ ส่วนไลบรารีจะจัดการการวนซ้ำและการจัดเรียงใหม่

local nums = {5, 2, 9, 1}
table.sort(nums, function(a, b)
  return a > b
end)

print(table.concat(nums, ", "))

ฟังก์ชันมีเอกลักษณ์เฉพาะตัว

ค่าฟังก์ชันทุกค่าคือออบเจ็กต์ที่แตกต่างกัน ฟังก์ชันที่เขียนแยกกันสองฟังก์ชันจะไม่เท่ากัน แม้จะมีโค้ดเหมือนกันทุกประการ

แต่ฟังก์ชันเดียวที่เก็บไว้ในตัวแปรสองตัวจะเปรียบเทียบแล้วเท่ากัน เพราะชื่อทั้งสองอ้างอิงค่าเดียวกัน

local f = function() return 1 end
local g = function() return 1 end
local h = f

print(f == g)
print(f == h)

เหตุใดเรื่องนี้จึงสำคัญ

การปฏิบัติต่อฟังก์ชันในฐานะค่าช่วยให้คุณเขียนเครื่องมือทั่วไปเพียงครั้งเดียว แล้วปรับแต่งด้วยฟังก์ชันที่ส่งเข้าไป การแมป การกรอง การประยุกต์ใช้บางส่วน และการประกอบฟังก์ชันล้วนต้องอาศัยแนวคิดนี้

ส่วนที่เหลือของหลักสูตรนี้จะสร้างรูปแบบการใช้งานจริงต่อยอดจากฟังก์ชันชั้นหนึ่งและคลอเชอร์

ตรวจสอบอย่างรวดเร็ว

ทดสอบความเข้าใจของคุณเกี่ยวกับฟังก์ชันชั้นหนึ่งใน Lua

สรุป

ฟังก์ชันใน Lua เป็นค่าชั้นหนึ่ง คุณสามารถเก็บไว้ในตัวแปรและตาราง ส่งเป็นอาร์กิวเมนต์ และคืนค่าจากฟังก์ชันอื่นได้

การคืนค่าฟังก์ชันที่เก็บตัวแปร local จากฟังก์ชันที่ครอบอยู่จะสร้างคลอเชอร์ แนวคิดเหล่านี้เป็นพื้นฐานของรูปแบบการเขียนโปรแกรมเชิงฟังก์ชันทั้งหมดที่จะเรียนต่อไป

คำถามที่พบบ่อย

บทเรียน “ฟังก์ชันในฐานะค่า” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “ฟังก์ชันในฐานะค่า” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Lua Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Lua Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “ฟังก์ชันในฐานะค่า”

จัดเก็บและส่งต่อฟังก์ชัน คุณปฏิบัติ Lua Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Lua Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Lua Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 1 จากทั้งหมด 4 บทเรียน

บทเรียน “ฟังก์ชันในฐานะค่า” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Lua Academy นี้ได้ไหม

ได้ บทเรียน Lua Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. ฟังก์ชันในฐานะค่า
  2. map, filter, reduce
  3. การประยุกต์ใช้บางส่วน
  4. การประกอบฟังก์ชัน
← กลับไปที่ Lua Academy