爲什麼,如果我稱之爲條件方法不使用塊,我可以做if foo? bar.baz
,但有一個塊我必須做的:運算符優先級對條件塊如何工作?
if foo?; bar.each { |n| n.baz } end
,我會怎麼做了多行數據塊相同?
bar.each do |n|
n.quack
end
爲什麼,如果我稱之爲條件方法不使用塊,我可以做if foo? bar.baz
,但有一個塊我必須做的:運算符優先級對條件塊如何工作?
if foo?; bar.each { |n| n.baz } end
,我會怎麼做了多行數據塊相同?
bar.each do |n|
n.quack
end
您可以使用這些建築,但如何上面提到它不可讀。你必須避免編寫不可讀的代碼。
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
您提供的第一個版本會將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
所有這些ifs都很難閱讀。將'bar.each'的結果提取到變量中,並且 - bam! - 問題消除了。另外,'#each'並不是你可能認爲的那樣。 –