-1

我的准备工作是要求我制作一个数组扩展文件,然后向其中添加一些方法。这是他们给我的:

describe Array do

  describe "#sum" do
    it "has a #sum method" do
      [].should respond_to(:sum)
    end

    it "should be 0 for an empty array" do
      [].sum.should == 0
    end

    it "should add all of the elements" do
      [1,2,4].sum.should == 7
    end
  end
end

所以我写了这个:

class Array
    def sum(array = [])
        add = 0
        if array == []
            array = add
      else
            while array.length > 0
            add = add + array.last
            array.pop
            end
            array = add
        end
        array
    end

end

我不断收到此错误:

Array   #sum
    has a #sum method
    should be 0 for an empty array
    should add all of the elements (FAILED - 1)

Failures:

  1) Array#sum should add all of the elements
     Failure/Error: [1,2,4].sum.should == 7
       expected: 7
            got: 0 (using ==)
     # ./14_array_extensions/array_extensions_spec.rb:23:in `block (3 levels) in <top (required)>'

Finished in 0.00241 seconds 3 examples, 1 failure

谢谢你的时间。

4

2 回答 2

3

扩展Array意味着您应该使用self而不是传入数组。现在,您正在对一个空数组(来自默认参数)而不是#sum被调用的数组求和。

于 2013-08-12T23:46:26.953 回答
0

在此站点的“重新打开并添加到任何类”部分中有一个很好的答案:http://www.runtime-era.com/2012/12/reopen-and-modify-ruby-classes-monkey。 html

这是下面粘贴的部分:

重新打开并添加到任何类

这种类型的修改可以对 Ruby 中的任何类进行。这包括 Gems 和核心 Ruby 类。假设我希望能够(天真地)对数组中的元素求和:

[1,2,3,4].sum

#undefined method `sum' for [1, 2, 3, 4]:Array (NoMethodError)

class Array

  def sum
    sum = 0
    self.each do |e|
        sum += e
    end
    sum
  end
end

[1,2,3,4].sum

#10

于 2014-08-04T00:52:00.650 回答