2012-08-24 123 views
1

我使用Lua作为配置语言。大家都知道,配置应该有全系统的和用户的配置。让Lua覆盖全局变量

我刚刚发现Lua会保留原始值而不是覆盖它们。

例如,这是第一个源文件,

-- a.lua 
var=1 

和第二源文件

-- b.lua 
var=2 

这里的结果:

> lua-5.1 
Lua 5.1.5 Copyright (C) 1994-2012 Lua.org, PUC-Rio 
> dofile ("a.lua") 
> dofile ("b.lua") 
> print(var) 
1 

没错。 var尚未被覆盖。这会使用户自己的配置不起作用。任何人都知道如何让默认的Lua概述变量具有相同的变量名称?非常感谢。 (上面的源代码就是例子,实际上我使用的是Lua和C)

PS:我再次检查了上面的测试,它的工作原理。请参阅尼科尔的回答下的评论。

+0

'a.lua'和'b.lua'都不会写入值'a'。事实上,我不知道为什么它不打印'nil'或者'1'来自哪里。你能提供一个可重现的案例吗? –

+0

@NicolBolas抱歉,我犯了一个错误。它应该是'print(var)'那里。 – ekd123

回答

3

通常的做法是有一个table系统参数和一个table用户参数。例如,

a.lua

sys = { var = 1; a = 3 } 

b.lua

usr = { a = 5; b = 7 } 

的配置管理器确实

setmetatable(usr,{__index = sys}) 

测试:

> =usr.a 
5 
> =usr.var 
1 
> =usr.b 
7 
> 
+0

表格很难由经理处理...有没有办法不使用表格? – ekd123

+0

@ ekd123:全局变量是*表中的*。从表中获取全局字段和字段之间的* only *区别是调用'lua_getglobal'与'lua_getfield'。 –

1

我试图重现您的错误,但它的工作原理与您预期的完全相同。所以,如果你得到了这个,那几乎可以肯定你正在做某个你没有提及的事情。你确定这些文件包含你说他们做的?

+0

...嗯,我再次检查,它的工作原理。但是我的软件确实无法正常工作..我没有提到过的一件事:它们不在同一个目录中。奇怪的是,如果我将系统范围内的一个(我没有写权限)复制到与用户conf相同的目录中,它就会起作用。也许是一个错误? – ekd123

+0

@ ekd123你可以在Lua shell中重现问题吗?如果没有,那么是的,可能存在一个错误,但它可能在您的代码中某处没有显示给我们。 –

+0

@ ekd123我没有看到上面的任何小测试...? Lua本身完全不关心代码来自哪里,这不太可能是问题所在。 –