块只有在它是第二个参数时才有效
Block only works if it is the second parameter
我正在使 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
只有当我将块作为第二个参数传递时它才有效。为什么是这样?块总是这种情况,还是仅针对这种特殊情况?
考虑一下你可以传递一个未命名的块,这在 Ruby 中很常见。
adder { 41 }
并且您可以完全删除 &block
参数。
命名块必须是最后一个参数。
所有方法都可以占用一个块。最简单的是不要对块做任何事情。
Documentation on Methods from ruby-doc.org for Ruby 2.2.0 states:
There are three types of arguments when sending a message, the
positional arguments, keyword (or named) arguments and the block
argument.
只有最后一个参数可用于捕获方法块。一般参数格式(按顺序)是
- 强制参数
- 可选参数
- 啪啪
- 更多强制参数
- 关键字参数
- 块参数
请注意,只有在将方法的块捕获为 Proc 对象时才需要 block 参数,因此您可以将其从 adder
方法中删除。每个 Ruby 方法都隐含地接受一个块。
我正在使 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
只有当我将块作为第二个参数传递时它才有效。为什么是这样?块总是这种情况,还是仅针对这种特殊情况?
考虑一下你可以传递一个未命名的块,这在 Ruby 中很常见。
adder { 41 }
并且您可以完全删除 &block
参数。
命名块必须是最后一个参数。
所有方法都可以占用一个块。最简单的是不要对块做任何事情。
Documentation on Methods from ruby-doc.org for Ruby 2.2.0 states:
There are three types of arguments when sending a message, the positional arguments, keyword (or named) arguments and the block argument.
只有最后一个参数可用于捕获方法块。一般参数格式(按顺序)是
- 强制参数
- 可选参数
- 啪啪
- 更多强制参数
- 关键字参数
- 块参数
请注意,只有在将方法的块捕获为 Proc 对象时才需要 block 参数,因此您可以将其从 adder
方法中删除。每个 Ruby 方法都隐含地接受一个块。