对数组求和的错误

时间:2017-10-28 23:06:12

标签: arrays ruby sum

所以我是ruby的新手,我练习做hackerrank练习,当我不得不总结一个数组时,我得到了以下错误:

  

solution.rb:6:in +&#39 ;: nil无法强制转换为Integer(TypeError)         来自solution.rb:6:simpleArraySum中的inblock'来自solution.rb:5:在每个'         来自solution.rb:5:insimpleArraySum'来自solution.rb:15:在`'

代码:

const sum = function (n, arr) {
    let sum = 0;
        for (let i = 0; i < n; i++) {
            sum += arr[i];
    }
    return sum;
};

类似的js代码:

{
    "name": "testing",
    "theme": "something"
    "themeProperties": {}
}

3 个答案:

答案 0 :(得分:4)

你的n大于数组-1中的元素数,所以它试图加总nil。

这里有一个更好的方法在Ruby中执行此操作,而不是很少使用它们。如果你想使用for,你可以从arr.length而不是参数n获得数组的长度。

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

真正的Ruby方式如下。 您注入一个填充0的变量并枚举数组的每个元素。 ||之间的变量是这个变量,用来记住我们的总和和被枚举的元素。

[1,5].inject(0){|sum, e| sum + e } 
=>6

或更短

[1,5].inject(0, &:+) 
=>6
如果使用Ruby 2.4

,或者更好/更短/可读(因此类似于Ruby)
[1, 5].sum
=> 6

答案 1 :(得分:1)

错误告诉您添加操作不成功,因为一个或多个值为nil。

在这种情况下,您确定i==ni[n]会有值吗?

请记住,数组是0索引的。意思是,如果数组的长度为n,则第n个值的索引实际上为n-1。

因此,当您的循环点击n时,您最终会尝试评估sum += nil,这会产生您看到的错误。

答案 2 :(得分:0)

正如其他人所说,这里的最佳做法可能就是使用arr#each enumerable方法(q.v。)

除此之外:我不确定你的变量n应该是什么,但我猜它是数组中元素的数量。我建议最好使用arr #length方法(返回数组中元素的 number ;减去1,使用零索引数组同步循环。)

test_arr = [1,2,3,4,5]

def sum(arr)
    sum = 0
    for i in (0..arr.length-1) do
        sum += arr[i]
    end
    return sum
end

sum(test_arr) => 15

(仅供参考:在JavaScript中使用arr.length可能是更好的做法(虽然使用JS .forEach或.reduce回调函数可能会更好。)

for (let i = 0; i < arr.length -1; i++) {