通过索引访问数组值时出错?

时间:2014-01-13 18:21:34

标签: ruby

尝试总结数组中的所有数字。 示例10 + 20 + 30应为60。

def sum *arr
  i=0
  total=0
  while i <= arr.count
    total += arr[i]
    i+=1
  end
  total
end

puts sum(10,20,30)

为什么我收到此错误。这段代码看起来应该对我有用。我究竟做错了什么?为什么不让它通过它的索引访问数组值?

p8.rb:23:in `+': nil can't be coerced into Fixnum (TypeError)
        from p8.rb:23:in `sum'
        from p8.rb:29:in `<main>'

3 个答案:

答案 0 :(得分:7)

更改

while i <= arr.count

while i < arr.count

arr[arr.count]总是出界。


Fyi写sum的简短方法是:

def sum *arr
  arr.inject(:+)
end

答案 1 :(得分:1)

Matt的回答为您提供了使用注入的规范Ruby方法。但是如果你还没有准备好学习注入,那么至少可以省去手动跟踪数组索引(你的实际问题所在!)的麻烦,方法是使用#each迭代数组:

def sum *arr
  total = 0
  arr.each do |x|
    total += x
  end
  total
end

puts sum(10,20,30) # => 60

答案 2 :(得分:0)

Matt的答案既光滑又正确,但是您遇到了错误,因为ruby零索引数组。所以如果你改变了计数条件 while i <= arr.count - 1

你的错误会消失