所以我是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": {}
}
答案 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==n
时i[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++) {