2013-03-04 228 views
2

我期望此代碼:爲什麼不這樣做的代碼什麼我希望

def print_call_and_return(string, &block) 
    puts string 
    block.call unless !block 
    "return" 
end 

puts print_call_and_return("parameter") do 
    puts "block" 
end 

打印:

parameter 
block 
return 

但是它實際上打印如下:

irb(main):011:0> puts print_call_and_return("parameter") do 
irb(main):012:1* puts "block" 
irb(main):013:1> end 
parameter 
return 
=> nil 

有人可以解釋這一點嗎?

+0

這是一個非常好的主意,爲您的問題提供更好的標題。 「爲什麼這個代碼沒有達到我所期望的」並沒有告訴我們關於你的問題的任何事情。 – 2013-03-05 02:16:50

回答

1

這並不工作:

puts print_call_and_return("parameter") { puts "block" } 

我想原因有運算符優先級的事情。 do/end具有比{}塊更高的優先級。

puts print_call_and_return("parameter") do 
    puts "block" 
end 

相同

puts(print_call_and_return("parameter")){ puts "block" } 
+1

但爲什麼其他表單不能正常工作? – iamnotmaynard 2013-03-04 18:58:42

+0

我已經更新了我的答案。與運營商優先權有關。 – 2013-03-04 19:02:48

+1

做的就像if和while等一樣,比任何表達都弱。 – danh 2013-03-04 19:04:58

1

print_call_and_return( 「參數」)打印 「參數」,並返回 「返回」

所以輸出迄今爲 「參數」

把print_call_and_return(「參數」)放在返回值上,即「返回」

所以到目前爲止的輸出是「參數」,然後「返回」

把答案放在零,並放置#什麼都不做。 do比任何表達式都弱,所以該塊適用於(puts函數)do,而不是puts(函數do)。

產量如預期。

+1

這就是答案,「放......做」什麼都不做。 – iamnotmaynard 2013-03-04 19:00:08