関数は、コードのブロックであり、コマンドに応じて複数回実行できます。また、イベントに接続したり、コールバックとして割り当てたりすることもできます。
基本的な関数
関数定義には以下が含まれます:
- 関数のスコープ(グローバルまたは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) -- 数字と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
メソッド
メソッドは、オブジェクトのメンバーである関数であり、クラスやtablesなどがあります。彼らは、最初の引数としてオブジェクト自体(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) -- WorkspacefirstPart.Destroy(firstPart)print(firstPart.Parent) -- nil-- コロン表記(メソッド)でパーツを破壊するlocal secondPart = Instance.new("Part")secondPart.Parent = Workspaceprint(secondPart.Parent) -- WorkspacesecondPart:Destroy()print(secondPart.Parent) -- nil
メソッドの定義
テーブルにメソッドを作成するには、メソッドの名前をキーとして、メソッド関数を値として使用します。メソッドの定義で、selfパラメーターはメソッドの親テーブルを指します。コロン表記を使用してメソッドを呼び出すと、テーブル自体を最初の引数として渡します。メソッドのためにパラメーターを定義できますが、selfパラメーターの後にリストする必要があります。
次の例では、testButtonテーブルはchangeEnabledキーの値としてメソッドを持っています。self.enabledの値を印刷することで、selfがメソッドの親テーブルを指していることを確認できます。
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 = 4print(string.format("その%sは%sです!", "ケーキ", "嘘")) -- そのケーキは嘘です!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("入力No.", i, "=", value)
end
end
variadic(10, "こんにちは", 20, "可変長関数")
--[[ 結果の出力:
名前付き引数 = 10
入力No. 1 = こんにちは
入力No. 2 = 20
入力No. 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