我正在通过rspec测试。这些是测试:
describe "adder" do
it "adds one to the value returned by the default block" do
adder do
5
end.should == 6
end
it "adds 3 to the value returned by the default block" do
adder(3) do
5
end.should == 8
end
end
这通过了测试:
def adder(n=1,&block)
yield + n
end
虽然没有:
def adder(&block,n=1)
yield + n
end
仅当我将块作为第二个参数传递时才有效。为什么是这样?块总是如此,或者仅仅是针对这种特殊情况?
答案 0 :(得分:1)
考虑一下你可以传递一个未命名的块,这在Ruby中很常见。
adder { 41 }
您可以完全删除&block
参数。
命名块必须是最后一个参数。
所有方法都可以阻止。大多数情况下,不会对一个块做任何事情。
Documentation on Methods from ruby-doc.org for Ruby 2.2.0 states:
发送邮件时有三种类型的参数, 位置参数,关键字(或命名)参数和块 参数。
答案 1 :(得分:0)
只有最后一个参数可用于捕获方法的块。一般参数格式(按顺序)是
请注意,只有将方法块作为Proc对象捕获时才需要块参数,因此您可以将其从adder
方法中删除。每个Ruby方法都隐式接受一个块。