ฟังก์ชัน คือ บล็อกของโค้ด ที่คุณสามารถรันได้หลายครั้งตามคำสั่ง นอกจากนี้คุณยังสามารถเชื่อมโยงฟังก์ชันเข้ากับ เหตุการณ์ หรือกำหนดฟังก์ชันเป็น callback ได้อีกด้วย
ฟังก์ชันพื้นฐาน
การกำหนดฟังก์ชันรวมถึง:
- ขอบเขต ของฟังก์ชัน (global หรือ local)
- คำสำคัญ function
- ชื่อของฟังก์ชันในรูปแบบ camelCase
- พารามิเตอร์ของฟังก์ชันในวงเล็บ (())
- บล็อกของโค้ด หรือ "เนื้อหา" ของฟังก์ชัน
- คำสำคัญ end
เนื้อหาของฟังก์ชันจะถูกรันเมื่อคุณเรียกฟังก์ชันนี้ เพื่อเรียกฟังก์ชัน ให้พิมพ์ชื่อของมันตามด้วยวงเล็บ คุณสามารถกำหนดตัวแปรเพื่อรับค่าผลลัพธ์ที่คืนกลับหรือใช้ค่าผลลัพธ์นั้นแทนตัวแปร
-- ฟังก์ชันนี้ไม่มีพารามิเตอร์และคืนค่า nil
local function addOneAndTwo()
local result = 1 + 2
print(result)
end
-- เรียกฟังก์ชันโดยไม่มีการส่งค่าผลลัพธ์
addOneAndTwo() -- 3
พารามิเตอร์
พารามิเตอร์คือ ตัวแปรที่คุณทำให้สามารถใช้งานได้ในฟังก์ชันและจะถูกใช้เฉพาะใน ขอบเขต ของฟังก์ชัน ฟังก์ชันไม่มีพารามิเตอร์ตามค่าเริ่มต้น หากคุณเรียกฟังก์ชันด้วยพารามิเตอร์มากกว่าที่มันคาดหวัง Luau จะไม่สนใจพารามิเตอร์ที่เกินเข้ามา หากคุณเรียกฟังก์ชันด้วยพารามิเตอร์น้อยกว่าที่มันคาดหวัง Luau จะส่งค่า nil สำหรับพารามิเตอร์ที่หายไปทั้งหมด
-- ฟังก์ชันนี้มีสองพารามิเตอร์: num1 และ num2
local function addNumbers(num1, num2)
print(num1 + num2)
end
addNumbers(2, 3) -- 5
addNumbers(5, 6, 7) -- 11
addNumbers(9) -- พยายามทำการคำนวณ (add) บนหมายเลขและ nil
การคืนค่า
ในเนื้อหาของฟังก์ชัน คำสำคัญ return จะคืนค่าผลลัพธ์จากการคำนวณ คุณสามารถคืนค่าหลายค่าได้จากฟังก์ชันเดียว return จะสิ้นสุดการทำงานของฟังก์ชัน และ Luau คาดหวังให้มีคำสำคัญ end ตามหลังคำสั่ง return ดังนั้นการเขียนโค้ดระหว่างคำสั่ง return และคำสั่ง end จะทำให้เกิดข้อผิดพลาด
-- ฟังก์ชันนี้คืนค่าผลลัพธ์เดียว
local function addNumbers(num1, num2)
local result = num1 + num2
return result
end
print(addNumbers(1, 2)) -- 3
local seven = addNumbers(3, 4)
print(seven) -- 7
-- ฟังก์ชันนี้คืนค่าหลายค่า: ผลรวมและความแตกต่าง
local function addAndSubtract(num1, num2)
local sum = num1 + num2
local difference = num1 - num2
return sum, difference
end
-- เรียกฟังก์ชันและคาดหวังค่าผลลัพธ์หลายค่า
local sum, difference = addAndSubtract(2, 3)
print(sum) -- 5
print(difference) -- -1
เมธอด
เมธอดคือฟังก์ชันที่เป็นสมาชิกของวัตถุ เช่น คลาส หรือ ตาราง เมธอดคาดหวังว่าวัตถุเอง (self) จะเป็นอาร์กิวเมนต์แรก เมื่อต้องการเรียกเมธอดให้ใช้การอ้างอิงด้วยเครื่องหมายโคลอน (:) แทนการอ้างอิงด้วยจุด (.) เพื่อส่ง self เป็นอาร์กิวเมนต์แรกโดยอัตโนมัติ
วัตถุทั้งหมดใน Roblox สืบทอดมาจาก Instance และมีเมธอดที่ใช้งานทั่วไป ได้แก่ Instance:Destroy(), Instance:Clone(), และ Instance:FindFirstChild()
local Workspace = game:GetService("Workspace")-- ทำลายส่วนหนึ่งด้วยการอ้างอิงด้วยจุด (ฟังก์ชัน)local firstPart = Instance.new("Part")firstPart.Parent = Workspaceprint(firstPart.Parent) -- WorkspacefirstPart.Destroy(firstPart)print(firstPart.Parent) -- nil-- ทำลายส่วนหนึ่งด้วยการอ้างอิงด้วยโคลอน (เมธอด)local secondPart = Instance.new("Part")secondPart.Parent = Workspaceprint(secondPart.Parent) -- WorkspacesecondPart:Destroy()print(secondPart.Parent) -- nil
การกำหนดเมธอด
ในการสร้างเมธอดในตารางให้ใช้ชื่อของเมธอดเป็นคีย์และฟังก์ชันของเมธอดเป็นค่า ในการกำหนดเมธอด คำสำคัญ self จะหมายถึงตารางที่เป็นพ่อแม่ของเมธอด เมื่อต้องการเรียกเมธอดโดยใช้การอ้างอิงด้วยโคลอน คุณจะส่งตารางเองเป็นอาร์กิวเมนต์แรก คุณสามารถกำหนดพารามิเตอร์สำหรับเมธอดได้ แต่คุณต้องระบุพารามิเตอร์เหล่านั้นหลังพารามิเตอร์ self
ในตัวอย่างต่อไปนี้ ตาราง testButton มีเมธอดเป็นค่าในคีย์ changeEnabled คุณสามารถตรวจสอบว่า self หมายถึงตารางที่เป็นพ่อแม่ของเมธอดโดยการพิมพ์ค่าของ self.enabled
local testButton = {
enabled = true,
changeEnabled = function(self, isEnabled)
self.enabled = isEnabled
print(self.enabled)
end
}
print(testButton.enabled) -- true
-- เรียกใช้เมธอด
testButton:changeEnabled(false) -- false
Callback
Callback คือ ฟังก์ชันที่ทำงานตอบกลับเมื่อมีฟังก์ชันหรือกระบวนการอื่นทำงาน
Callback พื้นฐาน
ฟังก์ชันสามารถถูกส่งไปยังฟังก์ชันอื่นได้ ตัวอย่างเช่น ฟังก์ชัน ไม่ระบุชื่อ สามารถถูกใช้เพื่อจัดการ callback ที่ table.sort() ใช้เพื่อเรียงลิสต์ของ Players จาก Players.GetPlayers()
local Players = game:GetService("Players")
local sortedPlayers = Players:GetPlayers()
table.sort(sortedPlayers, function(a, b)
-- ใช้ callback แบบไม่ระบุชื่อเพื่อเรียงผู้เล่นตามชื่อ
return a.Name < b.Name
end)
ใน Roblox API, callback หมายถึง ฟังก์ชันสมาชิกแบบเขียนเท่านั้น, callback จะรอจนกว่าจะคืนค่า ฟังก์ชัน callback ที่ใช้อย่างแพร่หลายได้แก่:
- MarketplaceService.ProcessReceipt ซึ่งจัดการการซื้อผลิตภัณฑ์ของนักพัฒนา
- BindableFunction.OnInvoke ซึ่งเรียกฟังก์ชันเมื่อสคริปต์เรียก BindableFunction:Invoke(...)
- RemoteFunction.OnClientInvoke ซึ่งเรียกฟังก์ชันเมื่อเซิร์ฟเวอร์เรียก RemoteFunction:FireClient(player, ...) หรือ RemoteFunction:FireAllClients(...)
- RemoteFunction.OnServerInvoke ซึ่งเรียกฟังก์ชันเมื่อไคลเอนต์เรียก RemoteFunction:InvokeServer(...)
ในการตั้งค่า callback ให้กำหนดฟังก์ชันให้กับมัน ตัวอย่างเช่น BindableFunction.OnInvoke เป็น callback ของ BindableFunction คุณสามารถตั้งค่าฟังก์ชันที่มีชื่อหรือตัวฟังก์ชัน ไม่ระบุชื่อ ให้กับมันได้ และคุณสามารถเรียก (invoke) ฟังก์ชันนั้นโดยการเรียกวิธี :Invoke() บน callback อาร์กิวเมนต์ที่คุณส่งไปยัง :Invoke() จะถูกส่งต่อไปยัง callback และค่าผลลัพธ์จากฟังก์ชัน callback จะถูกส่งกลับไปยังผู้เรียก :Invoke()
local bindableFunction = Instance.new("BindableFunction")
bindableFunction.OnInvoke = function(number)
return 2 * number
end
print(bindableFunction:Invoke(42)) -- 84
เทคนิคการฟังก์ชัน
ตัวจัดการเหตุการณ์
คุณสามารถกำหนดฟังก์ชันที่เรียกว่า ตัวจัดการเหตุการณ์ ให้ทำงานเมื่อเหตุการณ์เกิดขึ้น ตัวอย่างเช่น คุณสามารถสร้างฟังก์ชันที่เรียกว่า onPlayerAdded() เข้าไปในเหตุการณ์ Players.PlayerAdded เพื่อพิมพ์ชื่อของผู้เล่นที่เข้าร่วม สำหรับข้อมูลเพิ่มเติม ดูที่ เหตุการณ์
local Players = game:GetService("Players")
local function onPlayerAdded(player)
print(player.Name .. " เข้าร่วมเกมแล้ว!")
end
Players.PlayerAdded:Connect(onPlayerAdded)
ฟังก์ชันไม่ระบุชื่อ
คุณสามารถสร้างฟังก์ชันที่ไม่มีชื่อซึ่งเรียกว่า ฟังก์ชันไม่ระบุชื่อ เพื่อนำมาใช้เป็น callback และ ตัวจัดการเหตุการณ์ เช่นเดียวกับฟังก์ชันทั่วไป ฟังก์ชันไม่ระบุชื่อต้องเริ่มและสิ้นสุดด้วยคำสำคัญ function และ end แต่คุณไม่จำเป็นต้องใช้คำว่า local เพื่อบอกขอบเขตท้องถิ่นเพราะพวกมันมีขอบเขตท้องถิ่นโดยอัตโนมัติ
ในตัวอย่างต่อไปนี้ callback สำหรับฟังก์ชัน task.delay() และตัวจัดการเหตุการณ์สำหรับเหตุการณ์ Players.PlayerAdded ก็เป็นฟังก์ชันไม่ระบุชื่อเช่นกัน
-- ฟังก์ชันไม่ระบุชื่อใน callback สำหรับ task.delay()
task.delay(2, function(exactTimeElapsed)
print(exactTimeElapsed) -- 2.0064592329945
end)
-- ฟังก์ชันไม่ระบุชื่อในตัวจัดการเหตุการณ์
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
print(player.Name .. " เข้าร่วมเกมแล้ว!")
end)
ฟังก์ชันในโมดูลสคริปต์
คุณสามารถนำฟังก์ชันไปใช้ซ้ำในสคริปต์หลาย ๆ ไฟล์โดยการเก็บฟังก์ชันไว้ใน ModuleScripts ฟังก์ชันเป็นประเภทข้อมูลของ Luau ดังนั้นคุณสามารถเก็บฟังก์ชันไว้ในตารางพร้อมกับข้อมูลอื่น ๆ
ฟังก์ชันแบบหลากหลาย
ฟังก์ชันแบบหลากหลายรับอาร์กิวเมนต์ได้ไม่จำกัดจำนวน ตัวอย่างเช่น Globals.LuaGlobals.print() เป็นฟังก์ชันแบบหลากหลาย
print(2, "+", 2, "=", 2 + 2) --2 + 2 = 4print(string.format("เค้กคือ %s είναι ένα %s!", "เค้ก", "โกหก")) -- เค้กคือโกหก!print(string.char(115, 101, 99, 114, 101, 116)) -- secret
การกำหนดฟังก์ชันแบบหลากหลาย
ในการกำหนดฟังก์ชันแบบหลากหลายให้ใช้โทเค็น ... เป็นพารามิเตอร์สุดท้ายหรือตัวเดียว (อย่าสับสนกับ .., ตัวรวม operator) คุณสามารถใส่ค่า ... ลงในตารางเพื่อความสะดวกในการใช้งาน
local function variadic(named, ...)
local arguments = {...} -- บรรจุอาร์กิวเมนต์เพิ่มเติมลงในตาราง
print("อาร์กิวเมนต์ที่มีชื่อ =", named)
for i, value in arguments do
print("หมายเลขที่ป้อน:", i, "=", value)
end
end
variadic(10, "สวัสดี", 20, "ฟังก์ชันแบบหลากหลาย")
--[[ ผลลัพธ์:
อาร์กิวเมนต์ที่มีชื่อ = 10
หมายเลขที่ป้อน: 1 = สวัสดี
หมายเลขที่ป้อน: 2 = 20
หมายเลขที่ป้อน: 3 = ฟังก์ชันแบบหลากหลาย
]]
การส่งต่ออาร์กิวเมนต์
คุณสามารถกำหนดฟังก์ชันแบบหลากหลายเป็นตัวหุ้มรอบฟังก์ชันอื่นเพื่อส่งต่อหรือส่งอาร์กิวเมนต์จากตัวหุ้มไปยังฟังก์ชันอื่น
local function printAround(functionToPrintAround, ...)
print("ก่อนหน้า")
functionToPrintAround(...)
print("หลัง")
end
local function addNumbers(x, y, z)
print("x =", x)
print("y + z =", y + z)
end
printAround(addNumbers, 1, 2, 3)
--[[ ผลลัพธ์:
ก่อนหน้า
x = 1
y + z = 5
หลัง
]]
เรียกฟังก์ชันแบบหลากหลายด้วยอาเรย์
หากคุณต้องการส่งอาเรย์ของค่าที่อยู่ในตารางไปยังฟังก์ชันแบบหลากหลายทั่วไป เช่น print() คุณสามารถใช้ฟังก์ชัน unpack() ทั่วไปเพื่อนำค่าของตารางแทนที่จะส่งตัวตารางเอง
local squares = {1, 4, 9, 16, 25}print("เลขกำลังสอง 5 จำนวนแรกคือ:", unpack(squares))-- เลขกำลังสอง 5 จำนวนแรกคือ 1 4 9 16 25