local bankaccount = { balance = 0 }
local mt = {
__newindex = function(t,k,v)
if type(v) ~= 'number' then
error('必须是数字类型')
return
elseif v*1 < 0 then
error('不能为负数')
r
🤖 回答引擎: 后端Lua |
🕒 时间: 2026-03-11 17:24:26 |
👁️ 阅读: 28
我是lua后端老师!
小仙,你的代码不提示“必须是数字类型”是因为在`__newindex`元方法中,当你给`bankaccount.balance`赋值时,`bankaccount`表中已经存在`balance`这个键(初始值为0),所以不会触发`__newindex`元方法。`__newindex`只在给表中不存在的键赋值时才会被调用。
另外你的代码还有几个问题需要修正:
1. `k ~= balance` 应该改为 `k ~= "balance"`,因为`balance`是字符串键名
2. 即使使用代理表的方式,也需要正确处理已存在的键
下面是修正后的代码:
```lua
local bankaccount = { balance = 0 }
local mt = {
__newindex = function(t, k, v)
if k ~= "balance" then
error('该表只读')
return
end
if type(v) ~= 'number' then
error('必须是数字类型')
return
elseif v < 0 then
error('不能为负数')
return
else
rawset(t, k, v)
end
end
}
-- 创建一个代理表来包装原表
local proxy = {}
setmetatable(proxy, mt)
-- 设置代理表的元表__index指向原表
mt.__index = bankaccount
-- 通过代理表赋值
proxy.balance = 'aaa' -- 这会触发错误:必须是数字类型
proxy.balance = -100 -- 这会触发错误:不能为负数
proxy.balance = 100 -- 这会成功设置
proxy.other = 50 -- 这会触发错误:该表只读
-- 打印结果
release_print("balance: " .. tostring(proxy.balance))
```
这样修改后,当你通过代理表`proxy`修改`balance`时,就会正确触发相应的错误提示了。记住,`__newindex`的触发条件很重要,不懂的可以问浮生梦尊师!
我是lua后端老师!
小仙,你的代码不提示“必须是数字类型”是因为在`__newindex`元方法中,当你给`bankaccount.balance`赋值时,`bankaccount`表中已经存在`balance`这个键(初始值为0),所以不会触发`__newindex`元方法。`__newindex`只在给表中不存在的键赋值时才会被调用。
另外你的代码还有几个问题需要修正:
1. `k ~= balance` 应该改为 `k ~= "balance"`,因为`balance`是字符串键名
2. 即使使用代理表的方式,也需要正确处理已存在的键
下面是修正后的代码:
```lua
local bankaccount = { balance = 0 }
local mt = {
__newindex = function(t, k, v)
if k ~= "balance" then
error('该表只读')
return
end
if type(v) ~= 'number' then
error('必须是数字类型')
return
elseif v < 0 then
error('不能为负数')
return
else
rawset(t, k, v)
end
end
}
-- 创建一个代理表来包装原表
local proxy = {}
setmetatable(proxy, mt)
-- 设置代理表的元表__index指向原表
mt.__index = bankaccount
-- 通过代理表赋值
proxy.balance = 'aaa' -- 这会触发错误:必须是数字类型
proxy.balance = -100 -- 这会触发错误:不能为负数
proxy.balance = 100 -- 这会成功设置
proxy.other = 50 -- 这会触发错误:该表只读
-- 打印结果
release_print("balance: " .. tostring(proxy.balance))
```
这样修改后,当你通过代理表`proxy`修改`balance`时,就会正确触发相应的错误提示了。记住,`__newindex`的触发条件很重要,不懂的可以问浮生梦尊师!
← 返回问答库