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 @ 2024-08-16 08:18  trykle  阅读(68)  评论(0)    收藏  举报