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

时间:2019-04-19 22:33:15

标签: lua iteration traversal

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

我当时正在考虑使用标记方法(Lua的旧的元表/元方法机制),但仍然可以遍历表而无需使用for循环触发标记方法(例如,表do中的e ...)。 就像for语句使用rawget访问表内容一样。

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

谢谢

1 个答案:

答案 0 :(得分:0)

将表用作未升值是控制数据可见性的一种方法。请参阅《 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的返回表中添加更多功能(设置程序,获取程序,其他逻辑)以控制访问。

另一个示例

显示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