1. ホーム
  2. function

[解決済み] 関数の引数のデフォルト値を定義する

2023-01-27 13:17:28

質問

Luaのwikiで、見つからない引数のデフォルト値を定義する方法を見つけました。

function myfunction(a,b,c)
    b = b or 7
    c = c or 5
    print (a,b,c)
end

これしかないのでしょうか?PHPのスタイルである myfunction (a,b=7,c=5) は機能しないようです。Luaの方法がうまくいかないわけではなく、この方法しかないのかと思っています。

どのように解決するのですか?

PHPやPythonのように名前付き引数やデフォルト値が欲しい場合は、テーブルコンストラクタで関数を呼び出すことができます。

myfunction{a,b=3,c=2}

(これはLuaの多くの場所で見られるもので、例えば LuaSocketのプロトコルモジュールの高度な形式である のコンストラクタなどです。 IUPLua .)

この関数自体は、次のようなシグネチャを持つことができます。

function myfunction(t)
    setmetatable(t,{__index={b=7, c=5}})
    local a, b, c =
      t[1] or t.a, 
      t[2] or t.b,
      t[3] or t.c
    -- function continues down here...
end

パラメータの表から足りない値は __index テーブルから取得されます ( メタテーブルのドキュメント ).

もちろん、テーブル・コンストラクタや関数を使用すれば、より高度なパラメータ・スタイルを作成することができます。例えば はここで は、パラメータ名とデフォルト値を定義したテーブルから、名前付きまたは位置指定の引数テーブルを取る関数と、通常の引数リストを取る関数を構築する関数です。

言語レベルではない機能として、このような呼び出しは新しい動作やセマンティクスを提供するために変更することができる。

  • 変数が複数の名前を受け入れるようにすることができます。
  • 位置変数とキーワード変数を混在させることができる - そして両方を定義すると、どちらかが優先される(またはエラーが発生する)。
  • キーワードのみの位置なし変数も、名前なしの位置なし変数と同様に作ることができます。
  • かなり冗長なテーブルの構築は、文字列をパースすることによって行うことができる
  • 引数リストは、関数が1テーブル以外の何かで呼び出された場合、そのまま使用することができます。

引数トランスレータを書くのに便利な関数をいくつか紹介します。 unpack (に移動する)。 table.unpack に移動)。 setfenv (5.2で非推奨となり、新しい _ENV 構造で非推奨)、そして select (これは与えられた引数リストから一つの値を返すか、あるいは、リストの長さを '#' ).