有办法在Lua4.0中阻止表格的迭代吗?(或如何防止访问表格内容)

我想在Lua4.01中锁定表格内容的访问。不幸的是,我无法升级到Lua5.xx。

我考虑使用标签方法(Lua的旧元表/元方法机制),但仍然可以使用for循环(对于表格中的ie,e)遍历表格而不触发标签方法。就像for语句使用rawget来访问表格内容一样。

有办法锁定访问吗?我知道使用C API是可能的,但对于终端用户来说并不是真正可行的。

谢谢

点赞
用户4403144
用户4403144

使用表作为 Upvalue 是控制数据可见性的一种方法。请参见 Lua 4.0 参考手册中的 可见性和 Upvalues

你可以在函数中本地维护一个表来保存数据。这个表在函数外部是看不到的。

举个例子:

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

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

然后:

b = a()
b() -- 输出 “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
2019-04-19 23:52:14