参数传递和assert_difference

时间:2015-05-29 15:03:06

标签: ruby-on-rails ruby railstutorial.org

我是Ruby和Rails的新手。我不明白为什么以下代码(使用Rails' [ActiveSupport::Testing.assert_difference] 1方法)在参数1之后不需要逗号。代码来自Rails教程的Chapter 7

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

assert_difference的签名是:

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

因此我希望difference参数和block参数之间需要逗号,但显然不是这样。

为什么不需要逗号?

3 个答案:

答案 0 :(得分:1)

因为您使用特殊的do |args| ... end / { |args| ... }表示法传递了阻止。如果您将块作为普通参数传递,则需要逗号:

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

答案 1 :(得分:1)

块不是真正的参数 - 方法签名中显示的是此方法捕获在proc中传递给它的块,但这实际上是泄露给外部世界的实现细节。例如,如果您定义这样的方法

def foo(*args)
end

然后传递给此方法的块不会以args结尾。

但是,如果您正在传递一个proc(或响应to_proc的内容),则使用您希望将此参数作为方法块的&参数前缀,那么您确实需要逗号。

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

答案 2 :(得分:0)

不需要逗号,因为这是Ruby语法的工作方式。

Block可以通过2种方式传递给方法

1)使用do ... end

2)使用{ ... }

def some_method(&block)
  block.call
end

some_method { 2 + 2 }
#=> 4

some_method do
  2 + 2
end
#=> 4

在控制台中尝试这些示例,您将了解它们。

相关问题