4

関係のない love2d エンジンで lua コンソールを作成しました。メタテーブルをアップグレードして、より多くのことを実行できるようにしようとしています (ペア関数、ターゲット テーブルではなく別のテーブルのメタテーブルを変更するなど)。作成中のアドオンの 1 つは__changeindex、既存のテーブルを変更するときのイベントです。索引。

これを行うには、値を保持しないダミーテーブルをユーザーに提供する必要があります。ユーザーが何かを追加しようとすると、それが実際のテーブルで既に定義されているかどうかを確認し、それが call である場合は call __changeindex、そうでない場合は call __newindex. これは完全に機能しますが、他の多くの Lua テーブル関数が機能しなくなります (for loops/getmetatable/setmetatable)。これらの問題のほとんどに対して回避策を作成しましたが、正常に機能しますが、#t 演算子を機能させることができません。

t1={1,2,3}
t2=setmetatable({},{__getn=function(self) return #t1 end})

そして #t2 は本当に #t1 を返すはずです。これを行う方法はありますか?

このための私の既存のコードはここにあります

編集:これは私の最初の投稿なので、投稿ルールに完全に従わなかった場合はお詫びします。試してみました:)また、誰かが偽のテーブルと実際のテーブルのガベージコレクションを作成する方法を持っている場合は、本当に感謝しています

4

1 に答える 1

2

メタメソッドはありません__getn__len代わりに試してください。これはLua 5.2でのみ機能します

Lua 5.1#ではテーブルの演算子をオーバーロードできません

userdata を使用してプロキシ オブジェクトを作成できます。

t = newproxy(true)
getmetatable(t).__len = function()
    return 5
end

print(#t) --> 5

ただし、newproxy関数は文書化されていないことに注意してください。

于 2014-06-07T12:27:53.413 に答える