2012-12-21 38 views
0

爲什麼,如果我稱之爲條件方法不使用塊,我可以做if foo? bar.baz,但有一個塊我必須做的:運算符優先級對條件塊如何工作?

if foo?; bar.each { |n| n.baz } end 

,我會怎麼做了多行數據塊相同?

bar.each do |n| 
    n.quack 
end 
+1

所有這些ifs都很難閱讀。將'bar.each'的結果提取到變量中,並且 - bam! - 問題消除了。另外,'#each'並不是你可能認爲的那樣。 –

回答

1

您可以使用這些建築,但如何上面提到它不可讀。你必須避免編寫不可讀的代碼。

if true then [1, 2].map { |n| n * 2 } end 
=> [2, 4] 

[1, 2].map do |n| 
    n * 2 
end if true 
=> [2, 4] 

[1, 2].map do |n| 
    n * 2 
end if false 
=> nil 
1

您提供的第一個版本會將bar.each執行的結果傳遞給foo?所以它期待foo?採取論據。

僅當foo?爲真時,第二版纔會執行bar.each

我會建議您使用以下方式:

if foo? 
    bar.each do |n| 
    n.quack 
    end 
end 

這也回答了你的最後一個問題。

注意:如果你真的希望一個參數傳遞給foo?是塊的執行結果,你最好使用一個輔助變量:

cond = bar.each do |n| 
    n.quack 
end 

if foo? cond 
    .. do stuff 
end 
+0

'each'的結果是作爲結果傳回'bar',所以'cond'不需要,'if foo?酒吧「是等同的 - 只要該塊對」酒吧「沒有任何副作用(無論如何,這是一個壞主意)。 – iain

+0

@lain我說'你最好'不''你'應該'當然你可以決定不使用變量,但這對你的設計和可讀性都沒有幫助 –

+0

添加一些沒有做任何事情的變量是不好的做法,這意味着「每個」與「映射」的功能是等效的(在實踐中)。 – iain