2012-08-24 169 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本身完全不關心代碼來自哪裏,這不太可能是問題所在。 –