如何防止指定表内容被修改?

我在为微控制器编写端口处理程序时遇到了这个(非常简化的)情况。

3个文件

file1:

table = {var1 = true, var2 = true, var 3 = false, var 4 = true}
function dosomething()
    dosomething
    --根据当前条件来定义表中的布尔值
end

file2:实际上是一个菜单。如果输入,则更改表中相应的布尔值。

function selection()
     selection = interprete_input()
     invertVars(selection)
end

function invertVars(selection)
         table.selection = not table.selection
 end

file3:在简化的情况下,只使用表格中的布尔值来确定是否为给定情况运行。索引也被用作值。例如,表中的一个条目可以是 " ["ttyS0"] = true ",所以我知道该函数是否应该用于 COM-端口ttyS0

function needsVarsFromTable()
    for v,k in pairs(table)
        if k then
            --实际函数使用true/false作为指示器来确定是否要在表的条目中运行
            the_actual_function_that_needs_v(v)
        end
end

现在的问题是:

表中包含19个条目。其中2个必须是静态的。它们为false,永远不会为true。但是在我的脚本中,可以使它们为true,这将导致错误。

不幸的是,Lua没有静态变量。如何防止其他函数更改它们?这些其他函数仍然必须能够读取它们。

由于性能问题,我不想在读取@table中的每个var时都检查更改函数是否被允许。

点赞
用户1009479
用户1009479

如果您不熟悉元表和元方法,请阅读 PiL 13.4.5。在书中的代码的基础上,可以通过稍作修改来保护字段"var2":

local t = {var1 = true, var2 = true, var3 = false, var4 = true}

function protect_field(t)
    local proxy = {}
    local mt = {
    __index = t,
    __newindex = function (t, k, v)
        if k == 'var2' then
            error("attempt to update var2 field")
        else
            rawset(t, k, v)
        end
    end
    }
    setmetatable(proxy, mt)
    return proxy
end

t = protect_field(t)

现在更新字段"var1"是合法的:

t.var1 = false

但是t.var2 = false会触发错误。

2014-08-08 06:21:44