English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Luaでは、関数は文と表現を抽象化する主な方法であり、特殊な作業を処理したり値を計算したりすることができます。
Luaには多くの内建関数があります、それらを簡単にプログラムで呼び出すことができます、例えばprint()関数は引数をコントロールターミナルに印刷します。
Lua関数は主に二つの用途があります:
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、値の比較を行い最大値を返します:
--[[ 関数は二つの値の最大値を返します --]] function max(num1, num2) if (num1 > num2) then result = num1; else result = num2; end return result; end -- 関数を呼び出す print("二つの値の比較では最大値が ",max(10,4))}} print("二つの値の比較では最大値が ",max(5,6))}}
以上のコードの実行結果は:
二つの値の比較では最大値が 10 二つの値の比較では最大値が 6
Luaでは、関数を引数として関数に渡すことができます。以下の例を参照してください:
myprint = function(param) print("これはプリント関数" - ##",param,"##" end function add(num)1,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("ja.oldtoolbag.com", "w3codebox") > print(s, e) 5 10
Lua函数中,在return后列出要返回的值的列表即可返回多值,如:
function maximum (a) 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 语言类似,在函数参数列表中使用三点 ... 表示函数有可变的参数。
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
我们可以将可变参数赋值给一个变量。
例如,我们计算几个数的平均值:
function average(...) 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("#",...) 来获取可变参数的数量:
function average(...) 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
時には固定の引数と可変引数をいくつか必要とする場合がありますが、固定の引数は可変引数の前に配置する必要があります:
function fwrite(fmt, ...) ---> 固定の引数fmt return io.write(string.format(fmt, ...)) end fwrite("w3codebox\n") --->fmt = "w3codebox", 可変引数はありません。 fwrite("%d%d\n", 1, 2) --->fmt = "%d%d", 可変引数は 1 および 2
出力結果は:
w3codebox 12
通常、可変引数を遍历する際には{…}を使用しますが、可変引数にはnilが含まれる可能性があるため、以下を使用できます select 関数を使用して可変引数にアクセスします:select('#', …) または select(n, …)
select('#', …)は可変引数の長さを返します。
select(n, …)は引数リストの第 n 引数を返します。
select関数を呼び出す際には、固定の引数selector(選択スイッチ)と一連の可変引数を渡す必要があります。selectorが数字nの場合、selectは引数リストの第 n 引数があれば、それ以外は文字列 #として選択されるため、selectは引数の総数を返します。
例コード:
do function foo(...) for i = 1, select('#', ...) do -->引数の総数を取得する local arg = select(i, ...); -->引数を読み取る print("arg", arg); end end foo(1, 2, 3, 4); end
出力結果は:
arg 1 arg 2 arg 3 arg 4