Hàm là các khối mã mà bạn có thể thực thi 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 callback.
Hàm cơ bản
Một định nghĩa hàm bao gồm:
- Từ khóa function.
- Tên của hàm theo kiểu camelCase.
- Các tham số của hàm trong dấu ngoặc đơn (()).
- Khối mã, hay "thân", của hàm.
- Từ khóa end.
Thân của hàm sẽ được thực thi khi bạn gọi hàm. Để gọi một hàm, hãy gõ tên của nó theo sau là dấu ngoặc đơn. Bạn có thể định nghĩa một biến để nhận giá trị trả về hoặc sử dụng giá trị trả về thay cho một biến.
-- Hàm 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 hàm mà không có giá trị trả về
addOneAndTwo() -- 3Tham số
Tham số là các biến mà bạn cung cấp cho hàm và chỉ được sử dụng trong phạm vi của hàm. Mặc định, hàm không có tham số. Nếu bạn gọi một hàm với nhiều tham số hơn số mà nó mong đợi, Luau sẽ bỏ qua các tham số thừa. Nếu bạn gọi một hàm với ít tham số hơn số mà nó mong đợi, Luau sẽ truyền nil cho tất cả các tham số thiếu.
-- Hàm 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) -- cố gắng thực hiện phép toán (cộng) trên số và nilTrả về
Trong thân của hàm, từ khóa return trả về một kết quả từ một phép toán. Bạn có thể trả về nhiều giá trị từ một hàm. return kết thúc việc thực thi hàm, và Luau mong đợi từ khóa end theo sau các câu lệnh return, vì vậy việc viết mã giữa lệnh return và lệnh end sẽ gây ra lỗi.
-- Hàm này trả về một giá trị
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
-- Hàm này trả về nhiều giá trị: tổng và hiệu
local function addAndSubtract(num1, num2)
local sum = num1 + num2
local difference = num1 - num2
return sum, difference
end
-- Gọi một hàm và mong đợi nhiều giá trị trả về
local sum, difference = addAndSubtract(2, 3)
print(sum) -- 5
print(difference) -- -1Phương thức
Phương thức là các hàm 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. Chúng mong đợi đối tượng chính (self) là tham số đầu tiên. Khi bạn gọi một phương thức, hãy sử dụng ký hiệu hai chấm (:) thay vì ký hiệu chấm (.) để tự động truyền self làm tham số đầu tiên.
Tất cả các đối tượng trong Roblox đều kế thừa từ Instance và có các phương thức thường được sử dụng 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 chấm (hàm)
local firstPart = Instance.new("Part")
firstPart.Parent = Workspace
print(firstPart.Parent) -- Workspace
firstPart.Destroy(firstPart)
print(firstPart.Parent) -- nil
-- Phá hủy một phần với ký hiệu hai chấm (phương thức)
local secondPart = Instance.new("Part")
secondPart.Parent = Workspace
print(secondPart.Parent) -- Workspace
secondPart:Destroy()
print(secondPart.Parent) -- nilĐịnh nghĩa phương thức
Để tạo một phương thức trong một bảng, hãy sử dụng tên của phương thức làm khóa và hàm phương thức làm giá trị. Trong định nghĩa của phương thức, tham số self đề cập đến bảng cha của phương thức. Khi bạn gọi một phương thức bằng ký hiệu hai chấm, bạn truyền bảng chính nó làm tham số đầu tiên. Bạn có thể định nghĩa các 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 thức là giá trị của khóa changeEnabled. Bạn có thể xác minh rằng self đề cập đến bảng cha của phương thức 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) -- true
-- Gọi phương thức
testButton:changeEnabled(false) -- falseCallback
Callback là các hàm thực thi để phản hồi một hàm hoặc quy trình khác.
Callback cơ bản
Các hàm có thể được truyền vào các hàm khác, ví dụ, một hàm vô danh có thể được sử dụng để thực hiện một callback mà table.sort() sau đó sử dụng để sắp xếp một danh sách các Players từ Players.GetPlayers().
local Players = game:GetService("Players")
local sortedPlayers = Players:GetPlayers()
table.sort(sortedPlayers, function(a, b)
-- Sử dụng một callback vô danh để sắp xếp người chơi theo tên
return a.Name < b.Name
end)Trong API của Roblox, callback đề cập đến một thành viên hàm chỉ ghi, callback sẽ chờ cho đến khi chúng trả về. Các callback thường được sử dụng bao gồm:
- MarketplaceService.ProcessReceipt, xử lý việc mua sản phẩm của nhà phát triển.
- BindableFunction.OnInvoke, gọi hàm khi một script gọi BindableFunction:Invoke(...).
- RemoteFunction.OnClientInvoke, gọi hàm khi máy chủ gọi RemoteFunction:FireClient(player, ...) hoặc RemoteFunction:FireAllClients(...).
- RemoteFunction.OnServerInvoke, gọi hàm khi một client gọi RemoteFunction:InvokeServer(...).
Để thiết lập một callback, gán một hàm cho nó. Ví dụ, BindableFunction.OnInvoke là một callback của BindableFunction. Bạn có thể gán một hàm có tên hoặc vô danh cho nó, và bạn có thể gọi (invoke) hàm đó bằng cách gọi phương thức :Invoke() trên callback. Các tham số bạn truyền vào :Invoke() sẽ được chuyển tiếp đến callback, và giá trị trả về từ hàm callback sẽ trả về cho người gọi :Invoke().
local bindableFunction = Instance.new("BindableFunction")
bindableFunction.OnInvoke = function(number)
return 2 * number
end
print(bindableFunction:Invoke(42)) -- 84Kỹ thuật hàm
Bộ xử lý sự kiện
Bạn có thể gán một hàm, được gọi là bộ xử lý sự kiện, để thực thi khi một sự kiện xảy ra. Ví dụ, bạn có thể tạo một hàm gọi là onPlayerAdded() cho 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 .. " đã tham gia trò chơi!")
end
Players.PlayerAdded:Connect(onPlayerAdded)Hàm vô danh
Bạn có thể tạo các hàm không có tên, được gọi là hàm vô danh, để sử dụng làm callback và bộ xử lý sự kiện. Giống như các hàm có tên, các hàm vô danh cần bắt đầu và kết thúc bằng từ khóa function và end, nhưng bạn không cần từ khóa local để chỉ định phạm vi cục bộ vì chúng luôn có phạm vi cục bộ.
Trong ví dụ sau, callback cho hàm task.delay() và bộ xử lý sự kiện cho sự kiện Players.PlayerAdded đều là các hàm vô danh.
-- Hàm vô danh trong một callback cho task.delay()
task.delay(2, function(exactTimeElapsed)
print(exactTimeElapsed) -- 2.0064592329945
end)
-- Hàm vô danh trong một bộ xử lý sự kiện
local Players = game:GetService("Players")
Players.PlayerAdded:Connect(function(player)
print(player.Name .. " đã tham gia trò chơi!")
end)Hàm trong các script mô-đun
Bạn có thể tái sử dụng các hàm qua nhiều script bằng cách lưu trữ chúng trong ModuleScripts. Các hàm là một kiểu dữ liệu Luau, vì vậy bạn có thể lưu trữ chúng trong các bảng cùng với các dữ liệu khác.
Hàm biến số
Một hàm biến số chấp nhận bất kỳ số lượng đối số nào. Ví dụ, Globals.LuaGlobals.print() là một hàm biến số.
print(2, "+", 2, "=", 2 + 2) --2 + 2 = 4
print(string.format("Cái %s là một %s!", "bánh", "lừa dối")) -- Cái bánh là một lừa dối!
print(string.char(115, 101, 99, 114, 101, 116)) -- bí mậtĐịnh nghĩa hàm biến số
Để định nghĩa một hàm biến số, bạn sử dụng ký hiệu ... làm tham số cuối cùng hoặc duy nhất (không nên nhầm lẫn với .., toán tử nối chuỗi). 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 đối số bổ sung vào một bảng
print("Đối số có tên =", named)
for i, value in arguments do
print("Đầu vào số.", i, "=", value)
end
end
variadic(10, "Chào", 20, "Hàm biến số")
--[[ Kết quả đầu ra:
Đối số có tên = 10
Đầu vào số. 1 = Chào
Đầu vào số. 2 = 20
Đầu vào số. 3 = Hàm biến số
]]Chuyển tiếp đối số
Bạn có thể định nghĩa các hàm biến số như là các hàm bọc xung quanh các hàm khác để chuyển tiếp, hoặc chuyển, các đối số từ hàm bọc đến các hàm khác.
local function printAround(functionToPrintAround, ...)
print("Trước")
functionToPrintAround(...)
print("Sau")
end
local function addNumbers(x, y, z)
print("x =", x)
print("y + z =", y + z)
end
printAround(addNumbers, 1, 2, 3)
--[[ Kết quả đầu ra:
Trước
x = 1
y + z = 5
Sau
]]Gọi một hàm biến số với mảng
Nếu bạn muốn truyền một bảng mảng các giá trị đến một hàm biến số toàn cục, chẳng hạn như print(), bạn có thể sử dụng hàm toàn cục unpack() để truyền các giá trị của bảng thay vì bảng đó.
local squares = {1, 4, 9, 16, 25}
print("Năm số bình phương đầu tiên là:", unpack(squares))
-- Năm số bình phương đầu tiên là 1 4 9 16 25