码迷,mamicode.com
首页 > 其他好文 > 详细

在lua中创建字段安全的对象

时间:2017-08-19 23:27:40      阅读:106      评论:0      收藏:0      [点我收藏+]

标签:.com   return   报错   一个   turn   img   font   ges   16px   

  lua萌新,刚刚学习和使用不到一个月。有不对的地方,还望各路大神不吝赐教。

  lua中可以用table来模拟对象,但table是可以任意增加键值的。在对象模拟中,暂且也叫它为字段(field)吧。如果在面向对象中,你定义了一个对象,可以在对象以外的地方随意改动这个对象的字段,访问不存在的字段,你想象一下这有多恐怖?比如你定义了一个Vector3{float x = 0; float y = 0; float z = 0;}  我在外面某处加一个float t = 1; 当你在创建并引用这对象的时候,你就懵逼了,t是什么鬼?又或者你new 一个对象 vector,然后去取一个值,本来里面没有 t 这个字段,vector.t 给你返回一个空值,你是不是又懵逼了?到底是里面有这个字段值为空,还是压根就没这个字段?嗯? 感觉太不可控了。

  那么,有没有办法让它可控一点呢?有的。利用元表的__index 和__newindex,具体如下代码:

local Vector3 = {}
function Vector3:new()
    local v3 = 
    {
        x = 0,
        y = 0,
        z = 0,
    }

    setmetatable(v3, self)
    self.__index = 
        function(self, key)
            error("Vector3类型中没有定义字段:" .. key, 2)
        end
    self.__newindex = 
        function(self, key, value)
            error("Vector3类型中没有定义字段:" .. key, 2)
          end
    return v3
end

local v  = Vector3:new()
v.x = 2
--v.t = 3
print(v.x)
print(v.y)
--print(v.t) 

上面的代码输出:

技术分享

但当你尝试把v.t = 3 的注释去掉的话,就报错了:

技术分享

尝试去掉print(v.t)  的注释的话,也会报错:

技术分享

  这样就可以确保这个结构的安全,主要体现在不能在外部随意对它修改。

 

在lua中创建字段安全的对象

标签:.com   return   报错   一个   turn   img   font   ges   16px   

原文地址:http://www.cnblogs.com/yougoo/p/7398194.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!