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

时间:2014-08-08 05:50:50

标签: configuration static lua serial-port lua-table

在为微控制器编写端口处理例程时,我得到了这个(非常简化的)场景。 3个文件

文件1:

table = {var1 = true, var2 = true, var 3 = false, var 4 = true}
function dosomething()
    dosomething
    --defines bools in table by whatever condition is present
end

file2:实际上是一个菜单。如果给出了输入,则表中相应的布尔值会发生变化。

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

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

file3:在简化的场景中,只使用bools @ table来知道它是否适用于给定的情况。索引也用作值。例如,表格中的一个条目可以是' [" ttyS0"] = true'所以我知道是否应该运行COM-Port ttyS0的功能

function needsVarsFromTable()
    for v,k in pairs(table)
        if k then
            --the actual function uses true/false as indicator to know if to run 
            --for  the entry of table or not.
            the_actual_function_that_needs_v(v)
        end
end

现在的问题是:

该表包含19个条目。其中2个必须是静态的。他们是假的,永远不会是真的。但是在我的剧本中,有可能使它们成为真正的错误。

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

如果允许更改读取功能,我不想检查每个var @ Table,因为性能问题。

1 个答案:

答案 0 :(得分:3)

PiL 13.4.5提供了只读表的示例,如果您不熟悉metatables和metamethods,请阅读整章。

要保护字段"var2",可以对书中的代码进行一些修改:

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

function protect_field(t)
    local proxy = {}
    local mt = { -- create metatable
    __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会引发错误。