我想在Lua 4.01中锁定对表内容的访问。 不幸的是,我无法升级到Lua 5.xx。
我当时正在考虑使用标记方法(Lua的旧的元表/元方法机制),但仍然可以遍历表而无需使用for循环触发标记方法(例如,表do中的e ...)。 就像for语句使用rawget访问表内容一样。
是否可以锁定访问权限? 我知道可以使用C API,但是对于最终用户来说实际上是不可能的。
谢谢
答案 0 :(得分:0)
将表用作未升值是控制数据可见性的一种方法。请参阅《 Lua 4.0参考手册》中的Visibility and Upvalues。
您将数据维护在函数本地的表中。该表无法在该函数之外看到。
一个例子:
function a()
local t = {data = 123}
return function()
print(t.data)
end
end
然后:
b = a()
b() -- prints “123”
这里的错误做法是仅使用字母作为函数名称,但这引出了重点:b
只是调用a
返回的表。但是,此b
在被调用时会打印存储在a
的本地表t
中的数据。 没有其他方法可以访问t
,因此您可以通过这种方式控制表访问。在a
的返回表中添加更多功能(设置程序,获取程序,其他逻辑)以控制访问。
另一个示例
显示getter和setter访问权限:
function a()
local t = {data = nil}
local function set(data)
t.data = data
end
local function get()
return t.data
end
return {
set = set,
get = get
}
end
b = a()
b.set("abc")
print(b.get())
b.set(123)
print(b.get())
此打印:
abc
123