Lua 関数
Luaでは、関数は文と式を抽象化する主要な方法です。特定の作業を処理したり、値を計算したりするために使用できます。
Lua には多くの組み込み関数が用意されており、プログラム内で簡単に呼び出すことができます。例えば、print() 関数は渡された引数をコンソールに出力します。
Lua の関数には主に2つの用途があります:
- 1. 指定されたタスクを完了する。この場合、関数は呼び出し文として使用されます。
- 2. 値を計算して返す。この場合、関数は代入文の式として使用されます。
関数定義
Lua プログラミング言語の関数定義の形式は次のとおりです:
optional_function_scope function function_name( argument1, argument2, argument3..., argumentn) function_body return result_params_comma_separated end
解説:
optional_function_scope:このパラメータはオプションで、関数がグローバル関数かローカル関数かを指定します。未設定の場合、デフォルトでグローバル関数になります。関数をローカル関数に設定する場合は、キーワードを使用する必要があります。local。
function_name: 関数名を指定します。
argument1, argument2, argument3..., argumentn: 関数の引数。複数の引数はカンマで区切ります。関数は引数なしでも構いません。
function_body: 関数本体。関数内で実行するコード文のブロックです。
result_params_comma_separated: 関数の戻り値。Lua 言語の関数は複数の値を返すことができ、各値はカンマで区切ります。
例
以下の例では関数を定義しています。max()引数は num1, num2 で、2つの値の大小を比較し、最大値を返します:
例
function max(num1, num2)
if (num1 > num2) then
result = num1;
else
result = num2;
end
return result;
end
-- 関数を呼び出す
print("2つの値の比較で最大値は ",max(10,4))
print("2つの値の比較で最大値は ",max(5,6))
上記のコードの実行結果は次のとおりです:
两值比较最大值为 10 两值比较最大值为 6
Lua では、関数を引数として別の関数に渡すことができます。次の例のとおりです:
例
print("これは出力関数です - ##",param,"##")
end
function add(num1,num2,functionPrint)
result = num1 + num2
-- 渡された関数の引数を呼び出す
functionPrint(result)
end
myprint(10)
-- myprint 関数を引数として渡す
add(2,5,myprint)
上記のコードの実行結果は次のとおりです:
这是打印函数 - ## 10 ## 这是打印函数 - ## 7 ##
複数の戻り値
Lua の関数は複数の結果値を返すことができます。例えば string.find は、マッチした文字列の「開始と終了のインデックス」を返します(マッチする文字列がない場合は nil を返します)。
> s, e = string.find("www.example.com", "サンプル")
> print(s, e)
5 10
Lua の関数では、return の後に返したい値のリストを記述すると複数の値を返すことができます。例:
例
local mi = 1 -- 最大値のインデックス
local m = a[mi] -- 最大値
for i,val in ipairs(a) do
if val > m then
mi = i
m = val
end
end
return m, mi
end
print(maximum({8,10,23,12,5}))
上記のコードの実行結果は次のとおりです:
23 3
可変引数
Lua の関数は C 言語と同様に、可変数の引数を受け取ることができます。関数の引数リストで3つのドット(...)を使用します。... これは関数が可変引数を持つことを示します。
function add(...)
local s = 0
for i, v in ipairs{...} do --> {...} 表示一个由所有变长参数构成的数组
s = s + v
end
return s
end
print(add(3,4,5,6,7)) --->25
可変引数を変数に代入することができます。
例えば、いくつかの数値の平均を計算します:
例
result = 0
local arg={...} --> arg はテーブルであり、ローカル変数
for i,v in ipairs(arg) do
result = result + v
end
print("合計で " .. #arg .. " 個の引数")
return result/#arg
end
print("平均値は",average(10,5,3,4,5,6))
上記のコードの実行結果は次のとおりです:
总共传入 6 个数 平均值为 5.5
select("#",...) を使用して可変引数の数を取得することもできます:
例
result = 0
local arg={...}
for i,v in ipairs(arg) do
result = result + v
end
print("合計で " .. select("#",...) .. " 個の引数")
return result/select("#",...)
end
print("平均値は",average(10,5,3,4,5,6))
上記のコードの実行結果は次のとおりです:
总共传入 6 个数 平均值为 5.5
場合によっては、いくつかの固定引数に可変引数を加える必要があります。固定引数は可変引数の前に置く必要があります:
例
return io.write(string.format(fmt, ...))
end
fwrite("サンプル\n") ---> fmt = "サンプル"、可変引数なし。
fwrite("%d%d\n", 1, 2) ---> fmt = "%d%d"、可変引数は 1 と 2
出力結果は次のとおりです:
サンプル 12
通常、可変引数を走査するときは、次を使用するだけです。{…}、しかし可変引数にはいくつかの値が含まれる場合があります。nil、その場合は〜を使用できます。select関数を使用して可変引数にアクセスします:select('#', …)またはselect(n, …)
- select('#', …)可変引数の長さを返します。
- select(n, …)開始位置から返すために使用されます。n終了位置までのすべての引数リスト。
select を呼び出すときは、固定実引数 selector(選択スイッチ) と一連の可変引数を渡す必要があります。selector が数値 n の場合、select は引数リストのインデックスnから終了位置までのすべての引数リストを返します。それ以外の場合、selector は文字列のみです。#この場合、select は可変引数の総数を返します。
例
a = select(3,...) --> 3番目の位置から開始し、変数 a は右側の変数リストの最初の引数に対応します。
print (a)
print (select(3,...)) --> すべてのリスト引数を出力します。
end
f(0,1,2,3,4,5)
出力結果は次のとおりです:
2 2 3 4 5
例
function foo(...)
for i = 1, select('#', ...) do --> 引数の総数を取得
local arg = select(i, ...); --> 引数を読み取ります。arg は右側の変数リストの最初の引数に対応します。
print("arg", arg);
end
end
foo(1, 2, 3, 4);
end
出力結果は次のとおりです:
arg 1 arg 2 arg 3 arg 4その他の拡張