块只有在它是第二个参数时才有效

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.

只有最后一个参数可用于捕获方法块。一般参数格式(按顺序)是

  1. 强制参数
  2. 可选参数
  3. 啪啪
  4. 更多强制参数
  5. 关键字参数
  6. 块参数

请注意,只有在将方法的块捕获为 Proc 对象时才需要 block 参数,因此您可以将其从 adder 方法中删除。每个 Ruby 方法都隐含地接受一个块。