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
は、メタテーブルのテーブルから取得されます(メタテーブルのドキュメントを参照)。
もちろん、テーブルコンストラクターと関数を使用すると、より高度なパラメータースタイルが可能です。必要なものは何でも記述できます。例えば、ここではパラメータ名とデフォルト値と通常の引数リストを取る関数を定義テーブルから名前付きまたは-位置引数テーブルを取る関数を構築する機能です。
非言語レベルの機能として、このような呼び出しを変更して、新しい動作とセマンティクスを提供できます。
引数トランスレータを作成するためのいくつかの便利な関数は、(5.2でunpack
移動table.unpack
)、setfenv
(5.2で新しい_ENV
構造で非推奨)、およびselect
(指定された引数リストから単一の値、またはリストの長さを返す'#'
)です。
x or default
もこの応答に使用される式は本当にパラメータのデフォルト値に真の同等が、両方の場合のみ動作だけで単純な回避策ではないnil
とfalse
無効なパラメータ値です。ブールパラメータのデフォルトx
がでtrue
あり、呼び出し元が明示的なを渡したとしますfalse
。次に、明示的に渡された場合でも、x or true
を与えます。より良いバージョンは、より読みやすいでしょう。ただし、明示的な引数を処理することはできません。true
false
if x == nil then x = default end
nil
私の意見では、他の方法はありません。それはルアの考え方です。飾り気がなく、いくつかの糖衣構文を除いて、単純なことを行う冗長な方法はありません。
技術的にはありますがb = b == nil and 7 or b
(7false
とfalse or 7
評価される有効な値の場合に使用する必要があります)、それはおそらくあなたが探しているものではありません。
false
、より簡単な方法は、変数を最初に配置し、デフォルトを最後に配置することです。b = b or 7
b = b or 7
)。
私がこれまでに見つけた、意味のある唯一の方法は、次のようなことをすることです。
function new(params)
params = params or {}
options = {
name = "Object name"
}
for k,v in pairs(params) do options[k] = v end
some_var = options.name
end
new({ name = "test" })
new()