2011-10-14 26 views
1

所以,以爲我高明,我添加了這樣的方法來Object有塊紅寶石方法鏈 - 容易混淆不一致的語法錯誤

class Object 
    def apply_if(cond) 
    if cond 
     yield self 
    else 
     return self 
    end 
    end 
end 

這(我認爲)讓我有條件位添加到一個方法鏈,它簡化了我的ActiveRecord查詢操作。但是它給出了一個語法錯誤,我可以轉降低到下面的代碼:

data = [1,2,3,4,5] 
results = data. 
    apply_if(true and false) do |q| 
    q + [0,0] 
    end 

同樣的錯誤:

results = data.apply_if(true and false){|q| q + [0,0]} 

但這個工程:

results = data.apply_if ((true and false)) {|q| q + [0,0]} 

一樣:

results = data.apply_if (true && false) {|q| q + [0,0]} 

我明白了這與運算符優先級有什麼區別,但運算符在一對括號內的優先級怎麼重要?

爲什麼這裏有語法錯誤?我沒有看到任何可能的語法歧義,並且此方法在形狀上與Array#reduce方法相同。

我在這裏試過了一些組合 - 顯式的塊參數與調用,方法定義中的各種顯式優先級。使用lambda而不是塊可以很好地工作,但顯然太笨重以至於無法用於我的目的。

+0

Dude,Eric。我沒有教你更好嗎?這個代碼拼命地爲三元運算符喊出來! :) –

+0

我原來(也可能再次)寫它也接受條件位置(以對象爲參數的位置)的一個proc,它看起來最清潔的是3分支條件。我使用三元組,我喜歡! – nevinera

回答

5

這與您的任何代碼無關 - and運算符只是不允許在參數列表中。至於爲什麼,你不得不問核心團隊,但最明顯的可能性是IMO的存在理由(具有極低優先級)在參數列表中不起作用。

+1

我想知道我以前從未遇到那種限制?似乎是唯一的問題,謝謝:-) – nevinera

+2

我發現[紅寶石核心線程](http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/7553 )關於這個話題。參見[matz評論](http://blade.nagaokaut.ac.jp/cgi-bin/scat.rb/ruby/ruby-core/7559)和[答案](http://blade.nagaokaut.ac。 jp/cgi-bin/scat.rb/ruby​​/ruby​​-core/7560)就可以了。 – knut

+0

@knut:謝謝你。當你瘋狂的猜測實際上是對的時,你必須愛上它。 – Chuck