2017-03-07 76 views
0
describe Array do 
    describe "#sum" do 
    it "has a #sum method" do 
     expect([]).to respond_to(:sum) 
    end 

    it "should be 0 for an empty array" do 
     expect([].sum).to eq(0) 
    end 

    it "should add all of the elements" do 
     expect([1,2,4].sum).to eq(7) 
    end 
    end 
end 

上面的代碼是給我的測試代碼。並且我將下面的代碼用測試代碼進行測試。我認爲它會返回總數7.(1 + 2 + 4 = 7),但它返回0 ...我想它不會把[1,2,4]數組作爲參數。我究竟做錯了什麼?Ruby方法沒有得到數組參數

回答

1

由於現有的陣列類已經有一個初始化和數組的實例內自已是一個數組,你並不需要添加自己的初始化

class Array 

    def sum 
    self.inject(0){|sum,x| sum + x } 
    end 

end 

應該做你想要什麼。如果查找不明確,則查找注入,但它基本上與您嘗試使用代碼執行的操作相同,只是您使用局部變量來存儲總和。

如果這不僅是一個實驗,但我建議不要在覈心類上做猴子補丁,如果可以避免的話(通常是可以避免的)。這裏有一些提示,如何做到這一點,如果不能避免的話,這裏有一些文章:http://www.justinweiss.com/articles/3-ways-to-monkey-patch-without-making-a-mess/

+0

非常感謝你!真棒回答:-) – gin85

+0

我還有一個問題,如果你不介意。所以你說它已經初始化了,如果我只想得到[1,2,4]數組本身呢?我怎樣才能訪問它? (在上面的答案中,'x'如何得到數組[1,2,4]? – gin85

+0

在上面的例子中,'self'是引用數組。 'def sum'是一個實例方法,指的是數組的實例 - 在這種情況下[1,2,4] 什麼注入基本上定義sum = 0;然後遍歷數組(x始終是數組中的一個元素)。 – trueunlessfalse