1. ホーム
  2. スクリプト・コラム
  3. ルア

Lua関数使用研究

2022-01-06 13:29:36

での Lua基本構文クイックスタート Luaでは関数の使い方が取り上げられていますが、一般的な応用にとどまっているので、深く勉強していません。 
I. 関数と変数の使用法

関数は、キーワード function で定義します。そして、関数名と変数を追加します。その後にdo.がなく、endで終わることに注意してください。

関数内の変数はデフォルトではグローバル変数ですが、通常は関数内の変数は関数内で有効です。そこで、宣言に "local" を追加して、ローカルにのみ有効であることを示します。
II. 複数の結果値を返す

Luaの関数は複数の戻り値を返すことができます。これはC言語などとは大きく異なる点で、Luaは基本的に複数の代入をサポートしているからです。

私の推測では、内部的には複数の戻り値をテーブルにラップしているのだと思います。そして、代入されるときに順番に取り出されるのです。
この例を見てください。             

function max(a) 
 local mi = 1 
 local m = a[mi] 
 for i,val in ipairs(a) do -- where i is the sequential position and val is the corresponding value 
  print("i= ". .i.. "val=". .val) 
  if val >m then 
   mi = i 
   m = val 
  end 
 end 
 return m,mi 
end 
 
print(max({8,10,23,12,5})) 


この関数の目的は、系列の中で最大の値および添え字を返すことです。

実際には、C言語でlua_pcall(L,0,2,0)を呼び出すと、この2つの戻り値をスタックで受け取り、lua_tonumber(L,-1)とlua_tonumber(L,-2)に渡します。
III. 変数パラメータ

Luaの関数は可変数のパラメータを受け取ることができ、C言語の関数のパラメータ・リストと同様に3点(...)の使用は、その関数が可変数の引数を持つことを示しています。

Luaは関数の引数をargというテーブルに格納します。argテーブルには、引数のほかに、引数の数を示すフィールドnがあります。

例えば

function myprint(...) 
 local printResult = "" -- If not explicitly declared, the program will automatically check the global variables and will not find the error 
 print(arg.n) 
 for i,v in ipairs(arg) do 
  printResult = printResult..tostring(v)...' \t' 
 end 
 printResult = printResult...' \n' 
 return printResult 
end 
 
print(myprint(2,4,6,'2es'))