2015-01-21 62 views
1

我正在進行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

因爲它的方式紅寶石的作品。您可以將lambdas作爲參數傳遞到您想要的位置 – apneadiving 2015-01-21 09:07:22

+0

太棒了!所以這是一個規則。好吧,所以塊只能作爲最後一個參數傳遞,或者什麼是我無法在任何地方找到它的確切形式規則。 – vike272727 2015-01-21 09:17:02

+0

第二個版本對我來說是一個語法錯誤(ruby 2.2) – 2015-01-21 09:40:29

回答

1

請考慮您可以傳遞一個未命名的塊,這在Ruby中非常常見。

adder { 41 } 

而且您可以完全刪除&block參數。

命名塊必須是最後一個參數。

所有方法都可以佔用一個塊。大多數情況下,不對塊做任何事情。

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

有發送消息時三種類型的參數,則 位置參數,關鍵字(或命名)參數和塊 參數。

0

只有最後一個參數可用於捕獲方法的塊。一般參數格式(按順序)是

  1. 必要參數
  2. 可選參數
  3. 更具強制性參數
  4. 關鍵字參數
  5. 塊參數

注意塊參數僅用於捕獲方法的區塊k作爲一個Proc對象,因此您可以將它保留在您的adder方法之外。每個Ruby方法都隱含地接受一個塊。

相關問題