ฟังก์ชันในฐานะค่า
จัดเก็บและส่งต่อฟังก์ชัน
ฟังก์ชันในฐานะค่า เป็นบทเรียน 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ฟังก์ชันในฐานะค่า
- map, filter, reduce
- การประยุกต์ใช้บางส่วน
- การประกอบฟังก์ชัน