함수는 코드 블록으로, 명령에 따라 여러 번 실행할 수 있습니다. 또한 이를 이벤트에 연결하거나 콜백으로 지정할 수 있습니다.
기본 함수
함수 정의에는 다음이 포함됩니다:
- 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는 return 문 뒤에 end 키워드가 따라와야 한다고 기대하므로, 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) -- false콜백
콜백은 다른 함수나 프로세스에 응답하여 실행되는 함수입니다.
기본 콜백
함수는 다른 함수에 전달될 수 있으며, 예를 들어 익명 함수를 사용하여 table.sort()가 Players.GetPlayers()에서 Players 목록을 정렬하는 콜백을 구현할 수 있습니다.
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는 BindableFunction의 콜백입니다. 이름이 있는 함수나 익명 함수를 설정할 수 있으며, 콜백에서 :Invoke() 메서드를 호출하여 해당 함수를 호출(호출)할 수 있습니다. :Invoke()에 전달하는 인수는 콜백으로 전달되며, 콜백 함수의 반환 값은 :Invoke()의 호출자에게 반환됩니다.
local bindableFunction = Instance.new("BindableFunction")
bindableFunction.OnInvoke = function(number)
return 2 * number
end
print(bindableFunction:Invoke(42)) -- 84함수 기법
이벤트 핸들러
이벤트가 발생할 때 실행되도록 이벤트 핸들러로 알려진 함수를 할당할 수 있습니다. 예를 들어, Players.PlayerAdded 이벤트에 onPlayerAdded()라는 함수를 만들어 어떤 플레이어가 들어오는지 이름을 출력할 수 있습니다. 자세한 내용은 이벤트를 참조하세요.
local Players = game:GetService("Players")
local function onPlayerAdded(player)
print(player.Name .. " 게임에 참여했습니다!")
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 .. " 게임에 참여했습니다!")
end)모듈 스크립트의 함수
ModuleScripts에 저장하여 여러 스크립트에서 함수를 재사용할 수 있습니다. 함수는 Luau 데이터 유형이므로 다른 데이터와 함께 테이블에 저장할 수 있습니다.
가변 인수 함수
가변 인수 함수는 임의의 수의 인수를 수용합니다. 예를 들어, Globals.LuaGlobals.print()는 가변 인수 함수입니다.
print(2, "+", 2, "=", 2 + 2) --2 + 2 = 4
print(string.format("The %s is a %s!", "cake", "lie")) -- The cake is a lie!
print(string.char(115, 101, 99, 114, 101, 116)) -- secret가변 인수 함수 정의
가변 인수 함수를 정의하려면 마지막 또는 유일한 매개변수로 ... 토큰을 사용합니다(연결 연산자인 ..와 혼동하지 마세요). 사용 편의를 위해 ... 값을 테이블에 넣을 수 있습니다.
local function variadic(named, ...)
local arguments = {...} -- 추가 인수를 테이블에 포장
print("명명된 인수 =", named)
for i, value in arguments do
print("입력 번호.", i, "=", value)
end
end
variadic(10, "안녕하세요", 20, "가변 인수 함수")
--[[ 결과 출력:
명명된 인수 = 10
입력 번호. 1 = 안녕하세요
입력 번호. 2 = 20
입력 번호. 3 = 가변 인수 함수
]]인수 전달
가변 인수 함수를 다른 함수의 래퍼로 정의하여 인수를 전달하거나 전달할 수 있습니다.
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
이후
]]배열로 가변 인수 함수 호출
print()와 같은 전역 가변 인수 함수에 값의 테이블 배열을 전달하려면, 테이블 자체 대신 테이블의 값을 전달하기 위해 전역 unpack() 함수를 사용할 수 있습니다.
local squares = {1, 4, 9, 16, 25}
print("첫 5개의 제곱수는:", unpack(squares))
-- 첫 5개의 제곱수는 1 4 9 16 25