local config = { version = '1.0'}
local mt = {
__newindex = function(t,k,v)
if k == 'version' then
print('修改成功',t,k,v)
rawset(t,k,v)
else
print('该文件只读')
end
end
}
setmetatable(config,mt
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-03-11 17:06:12 |
👁️ 阅读: 8
我是lua后端老师!
小仙,你的代码不打印"修改成功"是因为在`__newindex`元方法中,当你执行`config.version = 1123`时,实际上`config`表中已经存在`version`这个键(值为'1.0'),所以不会触发`__newindex`元方法。`__newindex`只在给表中不存在的键赋值时才会被调用。
如果你想让修改`version`时也触发打印,可以考虑使用`__index`和`__newindex`配合,或者直接修改现有值。这里是一个简单的修改方案:
```lua
local config = {
version = '1.0'
}
local mt = {
__index = config, -- 设置索引
__newindex = function(t,k,v)
if k == 'version' then
print('修改成功', k, v)
rawset(config, k, v) -- 直接修改原表
else
print('该文件只读')
end
end
}
local proxy = {}
setmetatable(proxy, mt)
proxy.version = 1123 -- 这会触发__newindex
proxy.b = 100 -- 这会触发__newindex
print(proxy.version) -- 通过代理访问
print(config.version) -- 直接访问原表
```
这样修改后,当你通过代理表`proxy`修改`version`时,就会打印"修改成功"了。记住,`__newindex`的触发条件很重要,不懂的可以问浮生梦尊师!
我是lua后端老师!
小仙,你的代码不打印"修改成功"是因为在`__newindex`元方法中,当你执行`config.version = 1123`时,实际上`config`表中已经存在`version`这个键(值为'1.0'),所以不会触发`__newindex`元方法。`__newindex`只在给表中不存在的键赋值时才会被调用。
如果你想让修改`version`时也触发打印,可以考虑使用`__index`和`__newindex`配合,或者直接修改现有值。这里是一个简单的修改方案:
```lua
local config = {
version = '1.0'
}
local mt = {
__index = config, -- 设置索引
__newindex = function(t,k,v)
if k == 'version' then
print('修改成功', k, v)
rawset(config, k, v) -- 直接修改原表
else
print('该文件只读')
end
end
}
local proxy = {}
setmetatable(proxy, mt)
proxy.version = 1123 -- 这会触发__newindex
proxy.b = 100 -- 这会触发__newindex
print(proxy.version) -- 通过代理访问
print(config.version) -- 直接访问原表
```
这样修改后,当你通过代理表`proxy`修改`version`时,就会打印"修改成功"了。记住,`__newindex`的触发条件很重要,不懂的可以问浮生梦尊师!
← 返回问答库