在为微控制器编写端口处理例程时,我得到了这个(非常简化的)场景。 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,因为性能问题。
答案 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
会引发错误。