Menu
Coddy logo textTech

table.unpack と可変長引数

CoddyのLuaジャーニー「Luau入門」セクションの一部。レッスン 20/73。

ときどき、array 内に値があるものの、それらをseparateな値として扱う必要があります。たとえば、各 element をそれぞれ独自の argument として渡す場合です。それがtable.unpackです。array のすべての element を展開して返します。

local scores: {number} = {85, 92, 78}
print(table.unpack(scores))     -- 85  92  78  (1行、3つの値)
print(math.max(table.unpack(scores))) -- 92 — 各要素が引数になった

その反対がvarargsです。...を使って任意の number の argument を受け取る function です。Lua で...を見たことがあるでしょう。Luau ではそれを型付けできるため、入ってくるすべての値が一致しなければなりません。

local function sum(...: number): number
    local total = 0
    for i = 1, select("#", ...) do
        total += select(i, ...)
    end
    return total
end

select("#", ...)は到着した argument がいくつかを返し、select(i, ...)i の位置以降の argument を返します。式の中で単一の値として使う場合、実質的には「i 番目の argument」です。

この2つの機能は組み合わせて使えます。sum(table.unpack(scores))は、array をそのまま varargs function に展開します。これは、ほかの言語で見られる spread-call パターンに対する Luau の答えです。table.unpackは array を変更せずに読み取ります。

challenge icon

チャレンジ

簡単

859278を持つ型付き配列 scores: {number} を作成します。

  1. table.unpackを使用して、すべてのスコアを1行に出力します。
  2. math.maxtable.unpackを使用して、最高スコアを出力します。
  3. select("#", ...)select(i, ...)を使用してすべての引数を加算するlocal function sum(...: number): numberを定義し、その後sum(table.unpack(scores))を出力します。
  4. 通常の引数でも同じ関数が機能することを示すために、sum(10, 20)を出力します。

自分で試してみよう

-- ここにコードを書いてください
-- 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) を出力する
quiz icon腕試し

このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。

Luau入門のすべてのレッスン

自分で練習してみよう: Luaオンラインコンパイラ