Menu
Coddy logo textTech

可変長引数関数

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 と同様に、... は最後の parametertail)でなければなりません。通常の(型指定された)parameter を最初に配置し、variadic な末尾が残りを収集します。

function joinWords(separator: string, ...: string): string
    return table.concat({...}, separator)
end

print(joinWords("-", "a", "b", "c"))  -- a-b-c
challenge icon

チャレンジ

簡単

任意の数の number 引数(...: number)を受け取り、それらの合計を number として返す sumAll という名前の関数を作成してください。

任意の数の string 引数を受け取り、渡された個数を number として返す countValues という名前の関数を作成してください(select("#", ...) を使用してください)。

必須の separator: string とそれに続く任意の数の string 引数を受け取り、それらを区切り文字で結合した文字列を返す joinWords という名前の関数を作成してください({...} に対して table.concat を使用してください)— 戻り値の型は string です。

以下をそれぞれ改行して呼び出し、出力してください:

  1. sumAll(5, 10, 15)
  2. sumAll(1, 2, 3, 4, 5)
  3. countValues("a", "b", "c", "d")
  4. joinWords("-", "apple", "banana", "cherry")
  5. joinWords(" | ", "red", "green", "blue")

自分で試してみよう

-- ここにコードを書く
-- sumAll(...: number): number       -- {...} をループする
-- countValues(...: string): number  -- select("#", ...)
-- joinWords(separator: string, ...: string): string
-- その後、5つの結果を出力する
quiz icon腕試し

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

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