我想在Lua 4.01中锁定表内容的访问权限。不幸的是我无法升级到Lua 5.xx.
我正在考虑使用标记方法(Lua的旧metatable / metamethod机制),但是仍然可以遍历表而不使用for循环触发tagmethods(例如,表中的e表示...)。这就像语句使用rawget访问表内容一样。
有没有办法锁定访问?我知道可以使用C API但最终用户真的不可能。
谢谢
使用表作为非upvalue是一种控制数据可见性的方法。请参阅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
的返回表添加更多功能(setter,getters,其他逻辑)以控制访问。
另一个例子
显示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