2

Lua で ( " __eq" メタメソッドを使用して) 等価演算子をオーバーライドする場合、プリミティブの等価性をチェックする方法はありますか (つまり、オーバーライドされた を呼び出さず__eqに、2 つのテーブル値が参照的に同じかどうかをチェックしますか?)、これを行う必要があります。 C APIからですが、そこに適切な関数が見つかりません。

例えば:

lua_newtable(L);
lua_newtable(L);
assert(!some_comparison());
lua_pushvalue(L,-1);
assert(some_comparison());

Whereはメタメソッドsome_comparison()を呼び出しません__eq

lua_compare()(特に、これを満たさないことに注意してください。必要lua_rawcompare()であれば、または同等のものを提供するトリックまたは回避策が必要です。アイデアは、__eq実装での無限再帰を防ぐことです...)

4

1 に答える 1

4

私があなたの質問を正しく理解していれば、あなたは を使うつもりだと思いますlua_rawequal:

int lua_rawequal (lua_State *L, int index1, int index2);

インデックスindex1との 2 つの値index2が基本的に等しい (つまり、メタメソッドを呼び出さない) 場合は 1 を返します。それ以外の場合は 0 を返します。有効でないインデックスがある場合も 0 を返します。

于 2016-05-29T17:18:19.277 に答える