table.unpack と可変長引数
CoddyのLuaジャーニー「Luau入門」セクションの一部 — レッスン 20/73。
配列内に値があり、それらを*個別*の値として必要とする場合があります — 例えば、各要素を独自の引数として渡すためなどです。それが table.unpack です。配列のすべての要素を展開して返します。
local scores: {number} = {85, 92, 78}
print(table.unpack(scores)) -- 85 92 78 (1行、3つの値)
print(math.max(table.unpack(scores))) -- 92 — 各要素が引数になったその対となる機能が varargs です。... を介して任意の数の引数を受け取る関数です。Lua で ... を見たことがあるかもしれませんが、Luau ではそれに型を指定(type)できるため、渡されるすべての値が一致する必要があります:
local function sum(...: number): number
local total = 0
for i = 1, select("#", ...) do
total += select(i, ...)
end
return total
endselect("#", ...) は届いた引数が**いくつ**あるかを返し、select(i, ...) は*位置 i 以降*の引数を返します — 式の中で単一の値として使用される場合、これは実質的に「i 番目の引数」となります。
この2つの機能は連携します:sum(table.unpack(scores)) は配列を vararg 関数へ直接展開します — これは他の言語で見られるスプレッド呼び出しパターンに対する Luau の解決策です。table.unpack は配列を変更せずに読み取ります。
チャレンジ
簡単85、92、78 を含む型定義された array scores: {number} を作成します。
table.unpackを使用して、すべてのscoresをonelineに出力します。math.maxとtable.unpackを使用して、最高のスコアを出力します。select("#", ...)とselect(i, ...)を使用してすべてのargumentを加算するlocalfunctionsum(...: number): numberをdefineし、sum(table.unpack(scores))をprintします。sum(10, 20)をprintして、同じfunctionが通常のargumentでも動作することを示します。
自分で試してみよう
-- ここにコードを書いてください
-- 1) scores: {number} = {85, 92, 78} を宣言する
-- 2) print(table.unpack(scores)) と展開した scores の math.max を出力する
-- 3) select を使って sum(...: number): number を定義し、sum(table.unpack(scores)) を出力する
-- 4) sum(10, 20) を出力する
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
Luau入門のすべてのレッスン
7プロジェクト:Typed Task Manager
プロジェクト:タスクの型定義タスクを追加する関数