有没有办法在 Lua 4.0 中阻止 table 的迭代? (或者如何防止访问 table 内容)

Is there a way to block an iteration of a table in Lua 4.0 ? (or how to prevent the access of table content)

我想在 Lua 4.01 中锁定对 table 内容的访问。 很遗憾,我无法升级到 Lua 5.xx。

我正在考虑使用标记方法(Lua 的旧 metatable/metamethod 机制)但仍然可以遍历 table 而无需使用 for 循环触发标记方法(即, e 在 table 做 ...)。 这就像 for 语句使用 rawget 来访问 table 内容。

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

谢谢

使用 table 作为上值是一种控制数据可见性的方法。请参阅 Lua 4.0 参考手册中的 Visibility and Upvalues

您在函数的 table 本地维护数据。 table 在那个函数之外是看不到的。

一个例子:

function a()
    local t = {data = 123}

    return function()
        print(t.data)
    end 
end

然后:

b = a()
b() -- prints “123”

此处仅使用字母作为函数名称的错误做法,但它明白了要点:b 只是调用 a 的 table returned。但是这个 b,当被调用时,打印存储在 a 的本地 table t 中的数据。 没有其他方法可以访问t,所以通过这种方式可以控制table访问。向 a 的 return table 添加更多功能(setters、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