lua 使用setmetatable检查不存在的字段

和js一样,lua可以动态为对象添加字段,这在面向对象中是不可接受的理念

这里初始值,一定不能为nil

Person = {age = 0, name = ""}
function Person:new(o)
o = o or {}
setmetatable(o, self)
self.__index = function(table, key)
if self[key] == nil then
error("获取值时,不存在此字段: " .. key)
else
return self[key]
end
end
self.__newindex = function(table, key, value)
if self[key] == nil then
error("设置值时,不存在此字段: " .. key)
else
if value == nil then
error("''" .. key .. "' 值不允许设置为nil")
end
rawset(table, key, value)
end
end
return o
end
local p1 = Person:new()
p1.age = 1 -- 正确赋值
print(p1.age) -- 正确获取值
print(p1.age2) -- 错误获取值,不存在此对象,应报错
p1.age2 = 3 -- 错误设置值,不存在此对象,应报错
posted @   trykle  阅读(47)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示