ruby数组输入

ruby array input

我试图用Ruby编写一个小函数,它从用户那里得到一个数组,然后汇总数组中的数据。我把它写成

1
2
3
4
    def sum(a)
      total = 0
      a.collect { |a| a.to_i + total }
    end

然后,该函数通过一个rspec运行,该rspec首先向它输入一个空数组来测试它。这将导致以下错误

1
2
3
4
    sum computes the sum of an empty array
    Failure/Error: sum([]).should == 0
    expected: 0
        got: [] (using ==)

所以它告诉我,当它给空数组输入时,它应该得到0,但是它得到数组。我试着写一个if语句

1
2
3
4
5
    def sum(a)
      total = 0
      a.collect { |a| a.to_i + total }
      if total = [] then { total = 0 end }
    end

但它给了我一个错误的说法

1
    syntax error, unexpected '}', expecting => (SyntaxError)

我做错什么了?


你不应该用mapcollect来做这个。reduce/inject是合适的方法。

1
2
3
4
5
6
7
8
def sum(a)
  a.reduce(:+)
  # or full form
  # a.reduce {|memo, el| memo + el }

  # or, if your elements can be strings
  # a.map(&:to_i).reduce(:+)
end


1
gets.split.map(&:to_i).inject(:+)


看这里:如何在Ruby中求和数字数组?

这里是:http://www.ruby-doc.org/core-1.9.3/enumerable.html method-i-inject

1
2
3
def sum(a)
    array.inject(0) {|sum,x| sum + x.to_i }
end