块仅在第二个参数时有效

时间:2015-01-21 09:03:40

标签: ruby block

我正在通过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

仅当我将块作为第二个参数传递时才有效。为什么是这样?块总是如此,或者仅仅是针对这种特殊情况?

2 个答案:

答案 0 :(得分:1)

考虑一下你可以传递一个未命名的块,这在Ruby中很常见。

adder { 41 }

您可以完全删除&block参数。

命名块必须是最后一个参数。

所有方法都可以阻止。大多数情况下,不会对一个块做任何事情。

Documentation on Methods from ruby-doc.org for Ruby 2.2.0 states:

  

发送邮件时有三种类型的参数,   位置参数,关键字(或命名)参数和块   参数。

答案 1 :(得分:0)

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

  1. 强制性参数
  2. 可选参数
  3. 更多强制性参数
  4. 关键字参数
  5. 阻止参数
  6. 请注意,只有将方法块作为Proc对象捕获时才需要块参数,因此您可以将其从adder方法中删除。每个Ruby方法都隐式接受一个块。