2015-05-29 62 views
0

我是Ruby和Rails的新手。我不明白爲什麼下面的代碼(使用Rails的[ActiveSupport::Testing.assert_difference]1方法)在參數1之後不需要逗號。代碼來自Rails教程的Chapter 7參數傳遞和assert_difference

assert_difference 'User.count', 1 do 
    post_via_redirect users_path, ... 
end 

的簽名assert_difference是:

assert_difference(expression, difference = 1, message = nil, &block) 

因此我預計逗號將在difference參數和block參數之間需要但這顯然並非如此。

爲什麼不需要逗號?

回答

1

塊是不是真的參數 - 什麼方法簽名顯示出來的是,這種方法捕獲傳遞給它的一個進程塊,但這實際上是一個泄漏到外部世界的實現細節。例如,如果你這樣定義傳遞給此方法在args不會落得如此

def foo(*args) 
end 

然後塊的方法。

但是,如果您傳遞一個proc(或響應to_proc),使用您希望將此參數用作該方法的塊的&參數前綴,那麼您確實需要逗號。

my_proc = -> {post_via_redirect users_path} 
assert_difference User.count, 1, &my_proc 
1

因爲您使用特殊的do |args| ... end/{ |args| ... }表示法來傳遞該塊。如果你通過了塊作爲一個正常的參數,你需要的逗號:

block = proc { post_via_redirect users_path, ... } 
assert_difference 'User.count', 1, &block 
0

不需要逗號,因爲這是Ruby語法的工作原理。

塊可以傳遞給方法在2種方式

1)使用do ... end

2)使用{ ... }

def some_method(&block) 
    block.call 
end 

some_method { 2 + 2 } 
#=> 4 

some_method do 
    2 + 2 
end 
#=> 4 

嘗試在控制檯這個例子,你就會明白他們。