2011-11-09 68 views
0

Settingslogic fork允許數組作爲源,在紅寶石1.8.7一切正常,但在紅寶石1.9.2有一個錯誤。問題是這部分代碼中:Ruby 1.9.2 class_eval變量

self.class.class_eval <<-EndEval 
    def #{key} 
    return @#{key} if @#{key} 
    raise MissingSetting, "Missing setting '#{key}' in #{@section}" unless has_key? '#{key}' 
    value = fetch('#{key}') 
    @#{key} = value.is_a?(Hash) ? self.class.new(value, "'#{key}' section in #{@section}") : value 
    end 
EndEval 

@section == ["path_to_yml_file1", "path_to_yml_file2",...] 

貌似#{}在一些奇怪的方式進行評估,「#{@}節」似乎是一個數組,而不是一個字符串。有人可以解釋這一點嗎?

錯誤跟蹤:

@section == ["User/project/config/defaults.yml", "/Users/project/config/development.yml"] 


ruby-1.9.2-p290 :001 > Settings.keys 
SyntaxError: (eval):3: syntax error, unexpected tSTRING_BEG, expecting keyword_end 
...project/config/defaults.yml", "/Users/project... 
...        ^
(eval):3: syntax error, unexpected tSTRING_BEG, expecting keyword_end 
...project/config/development.yml"]" unless has_key? 'front' 
...        ^
(eval):5: syntax error, unexpected tSTRING_BEG, expecting ')' 
...project/config/defaults.yml", "/Users/project... 
...        ^
(eval):5: syntax error, unexpected tSTRING_BEG, expecting keyword_end 
...project/config/development.yml"]") : value 
...        ^
(eval):5: syntax error, unexpected ')', expecting keyword_end 
...project/config/development.yml"]") : value 
...        ^

from .../settingslogic-3b5d7d9cc319/lib/settingslogic.rb:198:in `class_eval' 

感謝所有幫助

+0

什麼是@section == [「User/project/config/defaults.yml」,「/Users/project/config/development.yml」]? –

+0

只是一個快捷方式,目的是顯示@section的值是多少... – santuxus

回答

1

你已經從主settingslogic做了一個分叉。那時它不支持數組作爲數據源,但現在它確實如此。嘗試使用主要的settingslogic存儲庫。

你的錯誤,現在與此相關的字符串:因爲在使用,而不是字符串數組的情況下

raise MissingSetting, 
    "Missing setting '#{key}' in #{@section}" unless has_key? '#{key}' 

./settings.yml 

你得到的東西是這樣的:

[\"./settings.yml\"] 

同發生在@#{key}以下。在主存儲庫中,此代碼被替換爲字符串連接。

+0

嗯 - 那麼哪個分支是主要的?因爲https://github.com/binarylogic/settingslogic似乎是主要的,但它不支持數組作爲源... – santuxus

+0

糟糕,似乎我犯了一個錯誤:(請看看這個:https:///github.com/greghaygood/settingslogic。這是greghaygood的分支,他加入了對多個文件的支持。 – WarHog

+0

沒問題;;)這個:https://github.com/siliconsalad/settingslogic也有效 - 區別在於greghaygood使用args *和第二個解決方案數組明確。現在它已經更改爲字符串連接了。我只是不明白爲什麼在這段代碼中「#{@ section}」可以在ruby 1.8中使用,並且它不適用於ruby 1.9.2 ... – santuxus

0

嘗試self.class_eval甚至沒有自我,沒有必要爲自動獲取類和自我的名稱分配給當前對象,即類。

+0

不,這部分代碼用於處理'Class'對象並在其中定義方法。 – WarHog

+0

我通過這段代碼檢查了我的答案「class Test; self.class_eval(」def test; puts'test'; end「); end」。它爲Test類創建測試方法,然後我可以用此方法派生對象。不是你想要的嗎? – megas

+0

這不是我的問題:)我的意思是'self.class.class_eval'是'settingslogic'的一部分,問題沒有與這部分代碼鏈接。該庫的作者希望將方法(通過def#{key}'評估)添加到Class對象,而不是Test對象,以便這些方法成爲任何類的類方法(Test.test,Object.test等)。這很奇怪,但它取決於這個寶石的作者;) – WarHog