2016-10-29 46 views
1

我正在從第360頁的書「The Rails Way」第3版中練習11.2.5將代碼存儲爲Proc對象,而我卻遇到了錯誤的正確輸出。 代碼在proc.rb文件「The Rails Way」第3版proc練習錯誤頁面360

def greet(&block) 
    block.call 
    "Good morning, everyone." 
end 
philippe_proc = Proc.new { return "Too soon, Philippe!" } 
philippe_lambda = lambda { return "Too soon, Philippe!" } 
p greet(philippe_proc)  # Too soon, Philippe! 
p greet(philippe_lambda) # Good morning, everyone. 

並且輸出是

ruby proc.rb 
proc.rb:1:in `greet': wrong number of arguments (given 1, expected 0) (ArgumentError) 
from proc.rb:7:in `<main>' 

紅寶石-v 紅寶石2.3.0p0(2015年12月25日修訂版53290)[x86_64的Linux的]

回答

2

嘗試

p greet(&philippe_proc)  
p greet(&philippe_lambda) 

塊是特殊參數。當你定義greet

def greet(&block) 

這&手段,是不是一個「正常參數」,而是一個塊,一個進程,一個lambda,你不得不說,即使你調用該方法。

這是因爲如果你有一個方法需要一個參數和一個塊,並且只傳遞其中的一個,你就不能說其中的哪一個。

+0

它給我另一個錯誤紅寶石proc.rb proc.rb:5:在'在

塊 ':意外的返回(LocalJumpError)從proc.rb \t:2:在'迎接' \t從proc.rb :7:在'
' –

+0

我相信它不會將&philippe_proc和&philippe_lambda與Proc.new關聯{return「太快了,Philippe!」 }和{return「太快了,菲利普!」 } 分別。 &符號不能用作變量名稱的開始。 –

+1

如果你有回報,lambda和proc之間是有區別的。返回從lambda返回的lambda,在這種情況下是可以的。但是從封閉方法返回一個proc返回值,在這種情況下你沒有一個返回值。這是問題。如果你在一個方法中嘗試,你沒有錯誤。但是你處於主要範圍。 – Ursus