1

特定の状況下で nil 値を取得できる関数fooがあります。つまりfoo(VarA)whileVarAは未定義です。この未定義VarAは解釈されるはずですが、オプション パラメータとして機能する必要があるため、"VarA"呼び出すことができません(通常の文字列パラメータとは異なります)。foo("VarA")VarA

mt = {__index = function(t, k) return k end}
setmetatable(_G, mt)

これで目的の結果が得られますが、他のすべての未定義変数はその名前を返します。のようにabc -> "abc"。この特定のケースでメタテーブルのみをアクティブにする方法はありますか? fooメソッドでメタテーブルを切り替えることができましたが、fooブロックにいるとき、渡されたパラメーターはすでに nil であり、遅すぎます。

付録: 質問が具体的ではなかったと思います。パラメータをテーブルとして渡すScholliiの答えは良かったが、意図したとおりに機能しない:

foo({option1 = delete, option2 = push})

これには、キー情報 (オプション 1 とオプション 2) と値の情報が含まれている必要があります (削除とプッシュがグローバルまたはローカル名前空間に存在しない場合でも)。Schollii のアプローチでは、重要な情報は得られますが、値の情報 (「削除」や「プッシュ」など) は得られません。これらの新しい「キーワード」は後で関数自体によって定義される必要があるため、削除とプッシュを事前に定義することはできません。これらの新しいキーワードを文字列として渡すことはできません。

4

2 に答える 2

1

Lua 内でドメイン固有言語を開発しているようです。それがあなたの意図であり、あなたが成功しているなら、素晴らしいことです。それ以外の場合は、より典型的な Lua プログラミング スタイルに固執することをお勧めします。

他の提案と同様:

-- lets the caller decide on the scope of varA
-- and the default string
foo(varA or "varA") 
于 2014-05-21T11:14:51.223 に答える