可変長引数関数
CoddyのLuaジャーニー「Luau入門」セクションの一部 — レッスン 27/73。
これまでに Lua の ...(varargs)を使って、任意の数の argument を受け取る関数を記述してきました。Luau では varargs に型を指定(Typed)できるため、渡されたすべての argument がチェックされます。
function sum(...: number): number
local total = 0
for _, n in ipairs({...}) do
total = total + n
end
return total
end
print(sum(1, 2)) -- 3
print(sum(1, 2, 3, 4, 5)) -- 15...: number は追加の argument がすべて number でなければならない(must)ことを宣言します。そのため、sum(1, "two") は型エラーになります。使用する記述は、普段使用しているものと同じです。
{...}はvarargsを配列(ここでは{number})にまとめますselect("#", ...)は渡されたargumentの数をカウントします...はmath.max(...)のように他のfunctionへ直接渡すことができます
Lua と同様に、... は最後の parameter(tail)でなければなりません。通常の(型指定された)parameter を最初に配置し、variadic な末尾が残りを収集します。
function joinWords(separator: string, ...: string): string
return table.concat({...}, separator)
end
print(joinWords("-", "a", "b", "c")) -- a-b-cチャレンジ
簡単任意の数の number 引数(...: number)を受け取り、それらの合計を number として返す sumAll という名前の関数を作成してください。
任意の数の string 引数を受け取り、渡された個数を number として返す countValues という名前の関数を作成してください(select("#", ...) を使用してください)。
必須の separator: string とそれに続く任意の数の string 引数を受け取り、それらを区切り文字で結合した文字列を返す joinWords という名前の関数を作成してください({...} に対して table.concat を使用してください)— 戻り値の型は string です。
以下をそれぞれ改行して呼び出し、出力してください:
sumAll(5, 10, 15)sumAll(1, 2, 3, 4, 5)countValues("a", "b", "c", "d")joinWords("-", "apple", "banana", "cherry")joinWords(" | ", "red", "green", "blue")
自分で試してみよう
-- ここにコードを書く
-- sumAll(...: number): number -- {...} をループする
-- countValues(...: string): number -- select("#", ...)
-- joinWords(separator: string, ...: string): string
-- その後、5つの結果を出力する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Luau入門のすべてのレッスン
7プロジェクト:Typed Task Manager
プロジェクト:タスクの型定義タスクを追加する関数