可変長引数関数 (...)
CoddyのLuaジャーニー「ロジックとプログラムの流れ」セクションの一部。レッスン 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() を使って、ほかのテーブルと同じようにこのテーブルを反復処理できます。
引数がnilでない限り、これは機能します。nilがあるとテーブルに隙間ができ、隙間のあるテーブルでは#は信頼できません。select("#", ...)は、nilも含めて常に引数の数を返します。
function countArgs(...)
return select("#", ...)
end
print(countArgs(10, 20, 30)) -- 出力: 3
print(countArgs(10, nil, 30, nil)) -- 出力: 4チャレンジ
簡単任意の数の数値引数を受け取り、その平均を返す関数 calculateAverage を作成してください。
可変長引数の構文 ... を使って任意の数の引数を受け取り、それらをテーブルに格納し、合計を計算して、個数で割ってください。
注意: スターターコード("Don't touch this code" と記されている部分)は入力から数値を読み取り、それぞれをテキストから数値に変換するために tonumber() を使い、numbers というテーブルに格納します。最後に、unpack(numbers) を使って関数を呼び出します。これはテーブルの値を個別の引数として展開するため、関数はそれらを ... として受け取ります。このコードを変更したり、細かく理解したりする必要はありません。calculateAverage の作成に集中してください。
ロジック:
{...}を使ってすべての引数をテーブルに格納する- テーブルを反復処理して、すべての数値の合計を計算する
- 合計を引数の数で割って平均を求める
- 平均を数値として返す
引数:
...(数値): 任意の数の数値引数
戻り値: 指定されたすべての数値の平均(数値)
自分で試してみよう
-- このコードは変更しないでください --
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
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
ロジックとプログラムの流れのすべてのレッスン
自分で練習してみよう: Luaオンラインコンパイラ