Chức năng là khối mã mà bạn có thể thực hiện nhiều lần theo lệnh.Bạn cũng có thể kết nối chúng với sự kiện hoặc gán chúng làm callbacks .
Chức năng cơ bản
Một định nghĩa hàm bao gồm:
- Phạm vi của chức năng (toàn cầu hoặc local).
- Từ khóa function .
- Tên của chức năng trong camelCase .
- Các tham số của chức năng trong dấu ngoặc ( () ).
- Khối mã, hoặc "thân", của chức năng.
- Từ khóa end .
Thân của chức năng được thực hiện khi bạn gọi chức năng.Để gọi một chức năng, hãy nhập tên của nó theo sau là dấu ngoặc.Bạn có thể định nghĩa một biến để chấp nhận giá trị trả về hoặc sử dụng giá trị trả về thay cho một biến.
-- Chức năng này không có tham số và trả về nil
local function addOneAndTwo()
local result = 1 + 2
print(result)
end
-- Gọi một chức năng mà không có return
addOneAndTwo() -- 3
Tham số
Tham số là biến cố mà bạn cung cấp cho chức năng và chỉ được sử dụng trong phạm vi của chức năng scope.Chức năng không có tham số mặc định.Nếu bạn gọi một chức năng với nhiều tham số hơn mong đợi, Luau bỏ qua các tham số bổ sung.Nếu bạn gọi một chức năng với ít tham số hơn nó mong đợi, Luau truyền nil cho tất cả các tham số bị thiếu.
-- Chức năng này có hai tham số: num1 và 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
Trở lại
Trong thân của chức năng, từ khóa return trả về kết quả từ một phép tính toán.Bạn có thể trả lại nhiều giá trị từ một chức năng.return kết thúc chức năng thực thi, và Luau mong đợi từ khóa end sẽ tuân theo các tuyên bố return , vì vậy viết mã giữa lệnh return và lệnh end ném lỗi.
-- Chức năng này trả về một giá trị trả lại
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
-- Chức năng này trả về nhiều giá trị: tổng và sự khác biệt
local function addAndSubtract(num1, num2)
local sum = num1 + num2
local difference = num1 - num2
return sum, difference
end
-- Gọi một chức năng và mong đợi nhiều giá trị trả lại
local sum, difference = addAndSubtract(2, 3)
print(sum) -- 5
print(difference) -- -1
Phương pháp
Các phương pháp là chức năng là thành viên của một đối tượng, chẳng hạn như một lớp hoặc bảng.Họ mong đợi đối tượng chính nó ( self ) là tham số đầu tiên.Khi bạn gọi một phương thức, sử dụng ký hiệu dấu chấm phân cách ( : ) thay vì ký hiệu dấu chấm ( . ) để truyền self như là tham số đầu tiên một cách tự động.
Tất cả các đối tượng trong Roblox đều xuất phát từ Instance và có các phương pháp được sử dụng phổ biến bao gồm Instance:Destroy() , Instance:Clone() và Instance:FindFirstChild() .
local Workspace = game:GetService("Workspace")-- Phá hủy một phần với ký hiệu dấu chấm (chức năng)local firstPart = Instance.new("Part")firstPart.Parent = Workspaceprint(firstPart.Parent) -- Không gian làm việcfirstPart.Destroy(firstPart)print(firstPart.Parent) -- không có-- Phá hủy một phần với ghi chú colon (phương pháp)local secondPart = Instance.new("Part")secondPart.Parent = Workspaceprint(secondPart.Parent) -- Không gian làm việcsecondPart:Destroy()print(secondPart.Parent) -- nil
Xác định các phương pháp
Để tạo một phương thức trong bảng, sử dụng tên của phương thức làm chìa khóa và chức năng phương thức làm giá trị.Trong định nghĩa của phương thức, tham số self tham chiếu đến bảng cha của phương thức.Khi bạn gọi một phương pháp bằng cách sử dụng biểu tượng colon, bạn truyền bảng chính như là argument đầu tiên.Bạn có thể xác định tham số cho một phương thức, nhưng bạn cần liệt kê chúng sau tham số self .
Trong ví dụ sau, bảng testButton có một phương pháp là giá trị của chìa khóa changeEnabled.Bạn có thể xác minh rằng self tham chiếu đến bảng cha của phương pháp bằng cách in giá trị của self.enabled .
local testButton = {
enabled = true,
changeEnabled = function(self, isEnabled)
self.enabled = isEnabled
print(self.enabled)
end
}
print(testButton.enabled) -- đúng
-- Gọi phương thức
testButton:changeEnabled(false) -- false
Các cuộc gọi trở lại
Các cuộc gọi trở lại là chức năng được thực hiện đáp lại chức năng hoặc quá trình khác.
Cuộc gọi cơ bản
Chức năng có thể được chuyển sang các chức năng khác, ví dụ, một chức năng vô danh có thể được sử dụng để thực hiện một cuộc gọi lại mà sau đó sử dụng để sắp xếp một danh sách của từ .
local Players = game:GetService("Players")
local sortedPlayers = Players:GetPlayers()
table.sort(sortedPlayers, function(a, b)
-- Sử dụng một cuộc gọi lại vô danh để sắp xếp người chơi theo tên
return a.Name < b.Name
end)
Trong API Roblox, các cuộc gọi trả lại tham chiếu đến thành viên chức năng chỉ đọc, các cuộc gọi trả lại cho đến khi họ trở lại. Các cuộc gọi phổ biến bao gồm:
- MarketplaceService.ProcessReceipt , xử lý việc mua sản phẩm nhà phát triển.
- BindableFunction.OnInvoke , mà gọi chức năng khi một kịch bản gọi BindableFunction:Invoke(...) .
- RemoteFunction.OnClientInvoke , mà gọi chức năng khi máy chủ gọi RemoteFunction:FireClient(player, ...) hoặc RemoteFunction:FireAllClients(...) .
- RemoteFunction.OnServerInvoke , mà gọi chức năng khi một khách hàng gọi RemoteFunction:InvokeServer(...) .
Để thiết lập một callback, gán một chức năng cho nó.Ví dụ, BindableFunction.OnInvoke là một callback của BindableFunction.Bạn có thể thiết lập một chức năng có tên hoặc vô danh cho nó, và bạn có thể gọi ( kích hoạt ) chức năng đó bằng cách gọi phương pháp trên callback.Các tham số bạn truyền cho :Invoke() đến callback, và giá trị trả lại từ chức năng callback trả về cho người gọi của :Invoke() .
local bindableFunction = Instance.new("BindableFunction")
bindableFunction.OnInvoke = function(number)
return 2 * number
end
print(bindableFunction:Invoke(42)) -- 84
Kỹ thuật chức năng
Xử lý sự kiện
Bạn có thể gán một chức năng, được gọi là một người xử lý sự kiện , để thực hiện khi một sự kiện bắt lửa.Ví dụ, bạn có thể tạo một chức năng có tên là onPlayerAdded() để sự kiện Players.PlayerAdded in tên của bất kỳ người chơi nào tham gia.Để biết thêm thông tin, xem Sự kiện.
local Players = game:GetService("Players")
local function onPlayerAdded(player)
print(player.Name .. " joined the game!")
end
Players.PlayerAdded:Connect(onPlayerAdded)
Chức năng vô danh
Bạn có thể tạo chức năng mà không có tên, được gọi là chức năng vô danh , để sử dụng làm callbacks và xử lý sự kiện .Giống như các chức năng có tên, các chức năng vô danh cần bắt đầu và kết thúc với các từ khóa function và end, nhưng bạn không cần từ khóa local để chỉ phạm vi địa phương bởi vì chúng luôn có phạm vi địa phương.
Trong ví dụ sau, hàm gọi lại cho chức năng task.delay() và bộ xử lý sự kiện cho sự kiện Players.PlayerAdded đều là chức năng vô danh.
-- Chức năng vô danh trong một cuộc gọi lại cho task.delay()
task.delay(2, function(exactTimeElapsed)
print(exactTimeElapsed) -- 2.0064592329945
end)
-- Chức năng vô danh trong xử lý sự kiện
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
print(player.Name .. " joined the game!")
end)
Chức năng trong kịch bản module
Bạn có thể tái sử dụng chức năng trên nhiều tập lệnh bằng cách lưu chúng trong ModuleScripts .Chức năng là một đánh máydữ liệu Luau, vì vậy bạn có thể lưu chúng trong các bảng với dữ liệu khác.
Chức năng biến dạng
Một chức năng variadic chấp nhận bất kỳ số lượng các tham số. Ví dụ, Globals.LuaGlobals.print() là một chức năng variadic.
print(2, "+", 2, "=", 2 + 2) --2 + 2 = 4print(string.format("The %s is a %s!", "cake", "lie")) -- Bánh là một lời nói dối!print(string.char(115, 101, 99, 114, 101, 116)) -- secret
Xác định chức năng biến dạng
Để xác định một chức năng variadic, bạn sử dụng token như tham số cuối cùng hoặc duy nhất (không nên nhầm lẫn với , operator concatenation ).Bạn có thể đặt các giá trị ... vào một bảng để dễ sử dụng.
local function variadic(named, ...)
local arguments = {...} -- đóng gói các tham số bổ sung vào một bảng
print("Named argument =", named)
for i, value in arguments do
print("Input No.", i, "=", value)
end
end
variadic(10, "Hi", 20, "Variadic Function")
--[[ Kết quả ra:
Named argument = 10
Input No. 1 = Hi
Input No. 2 = 20
Input No. 3 = Variadic Function
]]
Các tham số tiếp theo
Bạn có thể xác định chức năng biến dạng như wrapper xung quanh các chức năng khác để véhoặc chuyển các tham số từ wrapper sang các chức năng khác.
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)
--[[ Kết quả ra:
Before
x = 1
y + z = 5
After
]]
Gọi một chức năng biến dạng với mảng
Nếu bạn muốn truyền một mảng giá trị bảng sang một chức năng biến toàn cầu, chẳng hạn như print(), bạn có thể sử dụng chức năng toàn cầu unpack() để truyền các giá trị của bảng thay vì bản thân bảng.
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