ฟังก์ชัน เป็น บล็อกของโค้ด ที่คุณสามารถดําเนินการได้หลายครั้งตามคําสั่งคุณยังสามารถเชื่อมต่อกับเหตุการณ์ หรือกำหนดให้เป็น การโทรกลับ ได้
ฟังก์ชันพื้นฐาน
การนิยามฟังก์ชันรวมถึง:
- ขอบเขต ของฟังก์ชัน (ทั่วโลกหรือ 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) -- attempt to perform arithmetic (add) on number and 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) -- พื้นที่ทำงานfirstPart.Destroy(firstPart)print(firstPart.Parent) -- ไม่มี-- การทําลายส่วนด้วยการบันทึกโคลอน (วิธี)local secondPart = Instance.new("Part")secondPart.Parent = Workspaceprint(secondPart.Parent) -- พื้นที่ทำงาน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) -- จริง
-- เรียกวิธี
testButton:changeEnabled(false) -- false
การโทรกลับ
คอลเลกชันเป็นฟังก์ชันที่ดำเนินการตอบสนองต่อฟังก์ชันหรือกระบวนการอื่น
การโทรกลับพื้นฐาน
ฟังก์ชันสามารถส่งไปยังฟังก์ชันอื่นได้ ตัวอย่างเช่น ฟังก์ชัน ไม่ระบุชื่อ สามารถใช้เพื่อสร้างคอลเลกชันการเรียกคืนที่ใช้เพื่อจัดเรียงรายการจาก จาก จาก ได้
local Players = game:GetService("Players")
local sortedPlayers = Players:GetPlayers()
table.sort(sortedPlayers, function(a, b)
-- ใช้การโทรกลับแบบไม่ระบุชื่อเพื่อจัดเรียงผู้เล่นตามชื่อ
return a.Name < b.Name
end)
ใน Roblox API ฟังก์ชันการโทรกลับอ้างถึงสมาชิกฟังก์ชันแบบเขียนเท่านั้นการโทรกลับจะใช้จนกว่าจะกลับมา การโทรกลับที่ใช้กันอย่างแพร่หลายรวมถึง:
- MarketplaceService.ProcessReceipt ซึ่งจัดการการซื้อผลิตภัณฑ์นักพัฒนา
- BindableFunction.OnInvoke ซึ่งเรียกฟังก์ชันเมื่อสคริปต์เรียก BindableFunction:Invoke(...)
- RemoteFunction.OnClientInvoke ซึ่งเรียกฟังก์ชันเมื่อเซิร์ฟเวอร์เรียก RemoteFunction:FireClient(player, ...) หรือ RemoteFunction:FireAllClients(...)
- RemoteFunction.OnServerInvoke ซึ่งเรียกฟังก์ชันเมื่อไคลเอนต์เรียก RemoteFunction:InvokeServer(...)
เพื่อตั้งค่าการโทรกลับ กำหนดฟังก์ชันให้กับมันตัวอย่างเช่น BindableFunction.OnInvoke เป็น callback ของ BindableFunctionคุณสามารถตั้งฟังก์ชันที่มีชื่อหรือ ไม่ระบุชื่อ ให้กับมัน และคุณสามารถเรียก ( เรียก ) ฟังก์ชันนั้นโดยเรียกวิธี :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 .. " joined the game!")
end
Players.PlayerAdded:Connect(onPlayerAdded)
ฟังก์ชันที่ไม่ระบุชื่อ
คุณสามารถสร้างฟังก์ชันโดยไม่ต้องใช้ชื่อที่เรียกว่า ฟังก์ชันลับ เพื่อใช้เป็น ตัวเรียกคืน และ ตัวจัดการอีเวนต์เช่นเดียวกับฟังก์ชันที่มีชื่อ ฟังก์ชันที่ไม่ระบุชื่อต้องเริ่มและสิ้นสุดด้วยคีย์ function และ end แต่คุณไม่จำเป็นต้องใช้คีย์ local เพื่อระบุขอบเขตท้องถิ่นเพราะพวกเขามีขอบเขตท้องถิ่นเสมอ
ในตัวอย่างต่อไปนี้ ฟังก์ชันการโทรกลับสําหรับฟังก์ชัน task.delay() และตัวจัดการอีเวนต์สําหรับอีเวนต์ Players.PlayerAdded เป็นฟังก์ชันที่ไม่ระบุชื่อทั้งสอง
-- ฟังก์ชันไม่ระบุชื่อในการโทรกลับไปที่ 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 .. " joined the game!")
end)
ฟังก์ชันในสคริปต์โมดูล
คุณสามารถใช้ฟังก์ชันซ้ำได้ในหลายสคริปต์โดยเก็บไว้ใน ModuleScriptsฟังก์ชันเป็นประเภทข้อมูล Luau ดังนั้นคุณสามารถเก็บไว้ในตารางที่มีข้อมูลอื่นได้
ฟังก์ชัน Variadic
ฟังก์ชันแบบหลากหลายยอมรับจํานวนอาร์กิวเมนต์ใดๆ ตัวอย่างเช่น Globals.LuaGlobals.print() เป็นฟังก์ชันแบบหลากหลาย
print(2, "+", 2, "=", 2 + 2) --2 + 2 = 4print(string.format("The %s is a %s!", "cake", "lie")) -- เค้กเป็นเรื่องโกหก!print(string.char(115, 101, 99, 114, 101, 116)) -- secret
กำหนดฟังก์ชันแบบหลายตัว
เพื่อกำหนดฟังก์ชันแบบหลากหลาย คุณใช้โทเค็น ... เป็นพารามิเตอร์สุดท้ายหรือเพียงพารามิเตอร์เดียว (ไม่ควรสับสนกับ .. หรือตัวประกอบ )คุณสามารถใส่ค่า ... ในตารางเพื่อความสะดวกในการใช้งาน
local function variadic(named, ...)
local arguments = {...} -- บรรจุอาร์กิวเมนต์เพิ่มเติมลงในตาราง
print("Named argument =", named)
for i, value in arguments do
print("Input No.", i, "=", value)
end
end
variadic(10, "Hi", 20, "Variadic Function")
--[[ ผลผลิตที่ได้:
Named argument = 10
Input No. 1 = Hi
Input No. 2 = 20
Input No. 3 = Variadic Function
]]
อาร์กิวเมนต์ข้างหน้า
คุณสามารถกำหนดฟังก์ชันแบบหลากหลายเป็นตัวห่อรอบฟังก์ชันอื่นเพื่อส่งหรือส่งอาร์กิวเมนต์จากตัวห่อไปยังฟังก์ชันอื่น
local function printAround(functionToPrintAround, ...)
print("Before")
functionToPrintAround(...)
print("After")
end
local function addNumbers(x, y, z)
print("x =", x)
print("y + z =", y + z)
end
printAround(addNumbers, 1, 2, 3)
--[[ ผลผลิตที่ได้:
Before
x = 1
y + z = 5
After
]]
เรียกฟังก์ชัน variadic ด้วย阵列
หากคุณต้องการส่งค่าตารางของค่าไปยังฟังก์ชัน variadic ทั่วไป เช่น print() คุณสามารถใช้ฟังก์ชัน global unpack() เพื่อส่งค่าตารางแทนตารางเอง
local squares = {1, 4, 9, 16, 25}print("The first 5 square numbers are:", unpack(squares))-- The first 5 square numbers are 1 4 9 16 25