Menu
Coddy logo textTech

可変長引数関数 (...)

CoddyのLuaジャーニー「Logic & Flow」セクションの一部 — レッスン 11/54。

時には、任意の数の引数を扱うことができる関数が必要になることがあります。2つ、3つ、あるいは10個の数値の合計を、それぞれのケースに対して別々の関数を書くことなく計算したい場合があるでしょう。Luaはこのための特別な構文、3つのドット ... を提供しています。

関数のパラメータリストに ... を配置すると、任意の数の引数を受け取る可変引数関数になります。

function sum(...)
    -- 関数の本体
end

関数内では、再び ... を使用してこれらの引数にアクセスできます。それらをより簡単に扱うために、波括弧を使用してテーブルにまとめることができます:

function sum(...)
    local args = {...}
    local total = 0
    for i = 1, #args do
        total = total + args[i]
    end
    return total
end

print(sum(5, 10, 15))  -- 出力: 30
print(sum(1, 2, 3, 4, 5))  -- 出力: 15

{...} は、関数に渡されたすべての引数を含むリスト形式のテーブルを作成します。その後、長さ演算子 # または ipairs() を使用して、他のテーブルと同じようにこのテーブルを反復処理できます。

challenge icon

チャレンジ

簡単

任意の数の数値引数を受け取り、その平均値を返す関数 calculateAverage を作成してください。

可変長引数の構文 ... を使用して柔軟な数の引数を受け取り、それらをテーブルにまとめ、合計を計算して、個数で割ります。

注意: スターターコード("Don't touch this code" とマークされている部分)は、入力から数値を読み取り、tonumber() を使用して各テキストを数値に変換し、numbers という名前のテーブルに格納します。最後に、unpack(numbers) を使用して関数を呼び出します。これにより、テーブルの値が個別の引数として展開されるため、関数はそれらを ... として受け取ります。このコードを詳細に修正したり理解したりする必要はありません。calculateAverage の作成に集中してください。

ロジック:

  • {...} を使用して、すべての引数をテーブルにまとめます
  • テーブルを反復処理して、すべての数値の合計を計算します
  • 合計を引数の数で割り、平均を求めます
  • 平均を数値として返します

パラメータ:

  • ... (数値): 可変個の数値引数

戻り値: 提供されたすべての数値の平均 (数値)

チートシート

Luaは、3つのドットの構文 ... を使用して、任意の数の引数を受け取ることができる可変引数関数をサポートしています:

function sum(...)
    -- 関数の本体
end

可変引数関数内では、{...} を使用して引数をテーブルにまとめます:

function sum(...)
    local args = {...}
    local total = 0
    for i = 1, #args do
        total = total + args[i]
    end
    return total
end

print(sum(5, 10, 15))  -- 出力: 30
print(sum(1, 2, 3, 4, 5))  -- 出力: 15

{...} は、すべての引数を含むテーブルを作成します。長さ演算子 # または ipairs() を使用して、それを反復処理できます。

自分で試してみよう

-- このコードは変更しないでください --
local numbers = {}
while true do
    local input = io.read()
    if input == nil or input == "" then
        break
    end
    local num = tonumber(input)
    if num then
        table.insert(numbers, num)
    end
end
-------------------------

function calculateAverage(...)
    -- ここにコードを書いてください
end

local average = calculateAverage(unpack(numbers))
print("Average: " .. average)

quiz icon腕試し

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

Logic & Flowのすべてのレッスン