首页 > 解决方案 > 有没有办法阻止 Lua 4.0 中表的迭代?(或者如何防止表格内容的访问)

问题描述

我想在 Lua 4.01 中锁定对表格内容的访问。不幸的是,我无法升级到 Lua 5.xx。

我正在考虑使用标记方法(Lua 的旧元表/元方法机制),但仍然可以在不使用 for 循环触发标记方法的情况下遍历表(例如,e in table do ...)。就像 for 语句使用 rawget 访问表格内容一样。

有没有办法锁定访问权限?我知道使用 C API 是可能的,但对于最终用户来说实际上是不可能的。

谢谢

标签: luaiterationtraversal

解决方案


使用表作为 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

推荐阅读