lua - 有没有办法阻止 Lua 4.0 中表的迭代?(或者如何防止表格内容的访问)
问题描述
我想在 Lua 4.01 中锁定对表格内容的访问。不幸的是,我无法升级到 Lua 5.xx。
我正在考虑使用标记方法(Lua 的旧元表/元方法机制),但仍然可以在不使用 for 循环触发标记方法的情况下遍历表(例如,e in table do ...)。就像 for 语句使用 rawget 访问表格内容一样。
有没有办法锁定访问权限?我知道使用 C API 是可能的,但对于最终用户来说实际上是不可能的。
谢谢
解决方案
使用表作为 un upvalue 是一种控制数据可见性的方法。请参阅Lua 4.0 参考手册中的Visibility 和 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、getter、其他逻辑)以控制访问。
另一个例子
显示 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
推荐阅读
- php - 为什么第二组数组中有索引?
- android - 达到maxLength后如何将焦点更改为下一个EditText?
- php - laravel 文件上传会抛出错误“文件不存在或不可读”。
- c++ - 为什么循环是无限的?
- python - 两列之间的日期范围
- javascript - 在 Windows 上将 defaultPath 设置为这台电脑,可能吗?
- javascript - 我们可以禁用可编程视频 API 中的视频吗 - P2P 连接 - Twilio
- python - 当我编译为 .apk 时,Buildozer 不工作
- python - UnboundLocalError:分配前引用的局部变量“settingsText”
- javascript - Javascript 执行代码,单击按钮,等待新页面加载并单击第二个按钮等