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

问题描述 投票:2回答:1

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

我正在考虑使用标记方法(Lua的旧metatable / metamethod机制),但是仍然可以遍历表而不使用for循环触发tagmethods(例如,表中的e表示...)。这就像语句使用rawget访问表内容一样。

有没有办法锁定访问?我知道可以使用C API但最终用户真的不可能。

谢谢

lua iteration traversal
1个回答
0
投票

使用表作为非upvalue是一种控制数据可见性的方法。请参阅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的返回表添加更多功能(setter,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
© www.soinside.com 2019 - 2024. All rights reserved.