Lua类(元表)构造函数local对象及私有成员实现咨询
Lua元表(类)相关问题解答
问题1:构造函数中local声明obj的合理性
你在构造函数里用local obj的写法是完全正确的,甚至是更规范的实践。
网上很多示例里不写local直接赋值,大概率是为了简化示例代码,或是早期教程的不严谨写法——直接赋值的话,obj会变成全局变量,既会污染全局命名空间,还会因为Lua查找全局变量需要遍历全局表,导致效率更低。你的写法把obj限制在构造函数的局部作用域里,既安全又高效,完全没问题。
问题2:如何实现私有成员
Lua本身没有原生的私有成员机制,但可以通过闭包来模拟,用local变量实现真正的私有性,具体做法如下:
A = {} A.__index = A function A:new(obj_init) -- 把val定义为构造函数内的local变量,外部无法直接访问 local val = (obj_init and obj_init.val) or 0 local obj = {} setmetatable(obj, A) -- 提供公开的访问方法来操作私有变量 function obj:getVal() return val end function obj:setVal(new_val) -- 还可以在这里加参数校验逻辑 val = new_val end return obj end
这样使用时,外部只能通过getVal()和setVal()来操作val,无法直接访问:
x = A:new{val = 2} print(x:getVal()) -- 输出2 x:setVal(5) print(x:getVal()) -- 输出5 print(x.val) -- 输出nil,无法直接访问
注意:不能直接把val放在obj表里然后用local修饰——表的成员本身都是公开的,local只能限制变量的作用域,没法让表成员私有。闭包的方式是利用Lua的词法作用域,让私有变量只在构造函数和内部方法的作用域内可见。
内容的提问来源于stack exchange,提问作者DaveInDev
相关产品推荐
相关产品推荐

