有没有办法知道 lua 中的数组是否添加或删除了键?
Is there a way to know if there is a key added or removed from an array in lua?
local t = {}
local mt = setmetatable({
-- some meta method to know when a key is added or lost and prints a message
}, t)
有没有办法做到这一点。我和某人谈过这个,他们说我不能只用元方法来做,还可以用代理。我对如何进行这项工作有点困惑。有人可以帮忙吗?
谢谢
local tab = {}
local meta = {}
setmetatable( tab,
{ __newindex = function( self, key, value )
print( key, value )
rawset( self, key, value )
end
} )
tab [1] = 'this'
tab [#tab +1] = 'that'
tab .the = 'other'
tab [3] = nil
tab [4] = 2
要跟踪 lua 中的 table 键,metatable 中有 2 个最重要的键:__index
和 __newindex
。
__newindex
用于在 table 中创建新密钥,如果找不到这样的密钥。 __index
用于在table.
中没有这样的键时获取值
使用 __newindex
可以跟踪创建,但不能跟踪分配,因此无法跟踪密钥删除:
<script src="https://github.com/fengari-lua/fengari-web/releases/download/v0.1.4/fengari-web.js"></script>
<script type="application/lua">
local t={}
setmetatable(t, {
__newindex = function(self, key, value)
print('Added Key:'..key,'Value:'..value)
rawset(self, key, value)
end
})
t.test = 'test'
t.test = nil -- delete not tracked
t.test = 'test2'
</script>
使用代理 table 和 __newindex
以及 __index
我们可以跟踪每个分配:
<script src="https://github.com/fengari-lua/fengari-web/releases/download/v0.1.4/fengari-web.js"></script>
<script type="application/lua">
local t={}
local proxytable={}
setmetatable(t, {
__newindex = function(self, key, value)
if proxytable[key] then
if value == nil then
print('Deleted Key:'..key)
else
print('Changed Key:'..key,'Value:'..value)
end
else
print('Added Key:'..key,'Value:'..value)
end
rawset(proxytable, key, value)
end,
__index = proxytable
})
t.test = 'test'
t.test = nil
t.test = 'test2'
t.test = 'test3'
t.test = nil
</script>
如果您想用 pairs()
、ipairs()
枚举 table 键,则需要使用元键 __pairs
和 __ipairs
作为原始 [=46] =] 总是空的。
local t = {}
local mt = setmetatable({
-- some meta method to know when a key is added or lost and prints a message
}, t)
有没有办法做到这一点。我和某人谈过这个,他们说我不能只用元方法来做,还可以用代理。我对如何进行这项工作有点困惑。有人可以帮忙吗?
谢谢
local tab = {}
local meta = {}
setmetatable( tab,
{ __newindex = function( self, key, value )
print( key, value )
rawset( self, key, value )
end
} )
tab [1] = 'this'
tab [#tab +1] = 'that'
tab .the = 'other'
tab [3] = nil
tab [4] = 2
要跟踪 lua 中的 table 键,metatable 中有 2 个最重要的键:__index
和 __newindex
。
__newindex
用于在 table 中创建新密钥,如果找不到这样的密钥。 __index
用于在table.
使用 __newindex
可以跟踪创建,但不能跟踪分配,因此无法跟踪密钥删除:
<script src="https://github.com/fengari-lua/fengari-web/releases/download/v0.1.4/fengari-web.js"></script>
<script type="application/lua">
local t={}
setmetatable(t, {
__newindex = function(self, key, value)
print('Added Key:'..key,'Value:'..value)
rawset(self, key, value)
end
})
t.test = 'test'
t.test = nil -- delete not tracked
t.test = 'test2'
</script>
使用代理 table 和 __newindex
以及 __index
我们可以跟踪每个分配:
<script src="https://github.com/fengari-lua/fengari-web/releases/download/v0.1.4/fengari-web.js"></script>
<script type="application/lua">
local t={}
local proxytable={}
setmetatable(t, {
__newindex = function(self, key, value)
if proxytable[key] then
if value == nil then
print('Deleted Key:'..key)
else
print('Changed Key:'..key,'Value:'..value)
end
else
print('Added Key:'..key,'Value:'..value)
end
rawset(proxytable, key, value)
end,
__index = proxytable
})
t.test = 'test'
t.test = nil
t.test = 'test2'
t.test = 'test3'
t.test = nil
</script>
如果您想用 pairs()
、ipairs()
枚举 table 键,则需要使用元键 __pairs
和 __ipairs
作为原始 [=46] =] 总是空的。