ฟังก์ชัน คือ บล็อกของโค้ด ที่คุณสามารถเรียกใช้ได้หลายครั้งตามคำสั่ง คุณยังสามารถเชื่อมโยงฟังก์ชันกับ เหตุการณ์ หรือกำหนดให้เป็น callback
ฟังก์ชันพื้นฐาน
การกำหนดฟังก์ชันประกอบด้วย:
- คำสำคัญ 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) -- พยายามทำการคำนวณ (บวก) กับหมายเลขและ 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 = Workspace
print(firstPart.Parent) -- Workspace
firstPart.Destroy(firstPart)
print(firstPart.Parent) -- nil
-- ทำลายส่วนด้วยการเขียนด้วยเครื่องหมายสองจุด (เมธอด)
local secondPart = Instance.new("Part")
secondPart.Parent = Workspace
print(secondPart.Parent) -- Workspace
secondPart: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) -- falseCallback
Callback คือฟังก์ชันที่ทำงานเพื่อตอบสนองต่อฟังก์ชันหรือกระบวนการอื่น
Callback พื้นฐาน
ฟังก์ชันสามารถถูกส่งไปยังฟังก์ชันอื่นได้ ตัวอย่างเช่น ฟังก์ชัน anonymous สามารถใช้เพื่อดำเนินการ callback ที่ table.sort() จะใช้ในการจัดเรียงรายการของ Players จาก Players.GetPlayers()
local Players = game:GetService("Players")
local sortedPlayers = Players:GetPlayers()
table.sort(sortedPlayers, function(a, b)
-- ใช้ callback แบบ anonymous เพื่อจัดเรียงผู้เล่นตามชื่อ
return a.Name < b.Name
end)ใน API ของ Roblox, 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 คุณสามารถตั้งค่าฟังก์ชันที่มีชื่อหรือ anonymous ให้กับมัน และคุณสามารถเรียก (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)ฟังก์ชัน anonymous
คุณสามารถสร้างฟังก์ชันที่ไม่มีชื่อ ซึ่งเรียกว่า ฟังก์ชัน anonymous เพื่อใช้เป็น callback และ ตัวจัดการเหตุการณ์ เช่นเดียวกับฟังก์ชันที่มีชื่อ ฟังก์ชัน anonymous ต้องเริ่มต้นและสิ้นสุดด้วยคำสำคัญ function และ end แต่คุณไม่จำเป็นต้องใช้คำสำคัญ local เพื่อระบุขอบเขตท้องถิ่นเพราะมันมีขอบเขตท้องถิ่นเสมอ
ในตัวอย่างต่อไปนี้ callback สำหรับฟังก์ชัน task.delay() และตัวจัดการเหตุการณ์สำหรับเหตุการณ์ Players.PlayerAdded เป็นฟังก์ชัน anonymous ทั้งคู่
-- ฟังก์ชัน anonymous ใน callback สำหรับ task.delay()
task.delay(2, function(exactTimeElapsed)
print(exactTimeElapsed) -- 2.0064592329945
end)
-- ฟังก์ชัน anonymous ในตัวจัดการเหตุการณ์
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
print(player.Name .. " เข้าร่วมเกม!")
end)ฟังก์ชันในโมดูลสคริปต์
คุณสามารถนำฟังก์ชันมาใช้ซ้ำในหลายสคริปต์โดยการเก็บไว้ใน ModuleScripts ฟังก์ชันเป็นประเภทข้อมูล Luau ดังนั้นคุณสามารถเก็บไว้ในตารางพร้อมกับข้อมูลอื่น ๆ
ฟังก์ชัน variadic
ฟังก์ชัน variadic ยอมรับอาร์กิวเมนต์ได้ไม่จำกัดจำนวน ตัวอย่างเช่น Globals.LuaGlobals.print() เป็นฟังก์ชัน variadic
print(2, "+", 2, "=", 2 + 2) --2 + 2 = 4
print(string.format("เค้ก %s เป็น %s!", "เค้ก", "โกหก")) -- เค้กเป็นโกหก!
print(string.char(115, 101, 99, 114, 101, 116)) -- ความลับการกำหนดฟังก์ชัน variadic
ในการกำหนดฟังก์ชัน variadic คุณใช้โทเค็น ... เป็นพารามิเตอร์สุดท้ายหรือพารามิเตอร์เดียว (ไม่ควรสับสนกับ .., ตัวดำเนินการการเชื่อมต่อ operator) คุณสามารถใส่ค่า ... ลงในตารางเพื่อความสะดวกในการใช้งาน
local function variadic(named, ...)
local arguments = {...} -- บรรจุอาร์กิวเมนต์เพิ่มเติมลงในตาราง
print("อาร์กิวเมนต์ที่ตั้งชื่อ =", named)
for i, value in arguments do
print("หมายเลขอินพุต.", i, "=", value)
end
end
variadic(10, "สวัสดี", 20, "ฟังก์ชัน Variadic")
--[[ ผลลัพธ์ที่ได้:
อาร์กิวเมนต์ที่ตั้งชื่อ = 10
หมายเลขอินพุต. 1 = สวัสดี
หมายเลขอินพุต. 2 = 20
หมายเลขอินพุต. 3 = ฟังก์ชัน Variadic
]]การส่งต่ออาร์กิวเมนต์
คุณสามารถกำหนดฟังก์ชัน variadic เป็น wrapper รอบฟังก์ชันอื่น ๆ เพื่อส่งต่ออาร์กิวเมนต์จาก wrapper ไปยังฟังก์ชันอื่น ๆ
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
หลัง
]]เรียกฟังก์ชัน variadic ด้วยอาร์เรย์
หากคุณต้องการส่งอาร์เรย์ตารางของค่าไปยังฟังก์ชัน variadic ทั่วไป เช่น print() คุณสามารถใช้ฟังก์ชัน unpack() ของ global เพื่อส่งค่าของตารางแทนที่จะส่งตารางเอง
local squares = {1, 4, 9, 16, 25}
print("ตัวเลขสี่เหลี่ยม 5 ตัวแรกคือ:", unpack(squares))
-- ตัวเลขสี่เหลี่ยม 5 ตัวแรกคือ 1 4 9 16 25