我是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
参数之间需要逗号,但显然不是这样。
为什么不需要逗号?
答案 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
在控制台中尝试这些示例,您将了解它们。