ฟังก์ชัน

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

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

ฟังก์ชันพื้นฐาน

การนิยามฟังก์ชันรวมถึง:

  • ขอบเขต ของฟังก์ชัน (ทั่วโลกหรือ 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 = Workspace
print(firstPart.Parent) -- พื้นที่ทำงาน
firstPart.Destroy(firstPart)
print(firstPart.Parent) -- ไม่มี
-- การทําลายส่วนด้วยการบันทึกโคลอน (วิธี)
local secondPart = Instance.new("Part")
secondPart.Parent = Workspace
print(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 = 4
print(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