要素が追加されたときにサイジングを自動的に追跡するメタテーブルを使用してカスタムテーブルを作成しました。それは非常にうまく動作し、#
演算子またはgetn
関数の必要性を取り除きます。table.insertは__indexをトリガーしませんか?
ただし、問題があります。 table.insert
を呼び出すと、関数は明らかに__index
または__newindex
を呼び出すことはありません。したがって、私のテーブルは、いつ要素がこのように削除されるかを知ることができません。私は問題がtable.remove
と同じであると仮定します。
どのようにいずれかのことができます。
- は
insert
のイベントをキャプチャし、その insert
が私のテーブルの上に呼び出された場合、エラーをスロー行うには自分自身の関数を使用します。
あなたは__newindexでK、Vを印刷する場合は、そのkはtable.insert
はどこ値を挿入するために見つけるために、テーブルのサイズを要求するので、これは常に1であるおかげ
function Table_new()
local public = { }
local tbl = { }
local size = 0
function public.size()
return size
end
return setmetatable(public, {
__newindex = function(t, k, v)
local previous_v = tbl[k]
rawset(tbl, k, v)
if previous_v ~= nil then
if v == nil then
size = size - 1
end
elseif v ~= nil then
size = size + 1
end
end,
__index = tbl
})
end
local t = Table_new()
t[5] = "hi"
t[17] = "hello"
t[2] = "yo"
t[17] = nil
print(t.size()) -- prints 2
local z = Table_new()
table.insert(z, "hey")
table.insert(z, "hello")
table.insert(z, "yo")
print(z.size()) -- prints 1 -- why?
@lhf申し訳ありませんが私の例を再入力したとき、私は間違いを犯しました。私は問題を持っていて、hahaが存在しない変数を参照していない私の質問を更新しました。 – Hatefiend
Lua 5.1ではプログラムは '1'ではなく' 0'を出力します。 –
@EgorSkriptunoffそれは変です。この例では[Luaのデモサイト](https://i.imgur.com/L8xrmmO.png)で通訳を使っていました。それはなぜ異なった結果を印刷するのですか? [あなたは正しいですが](https://i.imgur.com/FnAPt1E.png)。なぜか分からない。 – Hatefiend