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つの値の大小を比較し、最大値を返します:

    例

    --[[ 関数は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 では、関数を引数として別の関数に渡すことができます。次の例のとおりです:

    例

    myprint = function(param)
       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 の後に返したい値のリストを記述すると複数の値を返すことができます。例:

    例

    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 言語と同様に、可変数の引数を受け取ることができます。関数の引数リストで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

    可変引数を変数に代入することができます。

    例えば、いくつかの数値の平均を計算します:

    例

    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("サンプル\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 は可変引数の総数を返します。

    例

    function f(...)
        a = select(3,...)  --> 3番目の位置から開始し、変数 a は右側の変数リストの最初の引数に対応します。
        print (a)
        print (select(3,...)) --> すべてのリスト引数を出力します。
    end

    f(0,1,2,3,4,5)

    出力結果は次のとおりです:

    2
    2       3       4       5

    例

    do  
        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
    
    その他の拡張