我试图仅对传递给我的函数的数组中的整数求和,但仍然遇到错误。这就是我现在所拥有的。
def sum(*x)
x.each { |i|
unless i.is_a? Integer
x.delete_at(x.index(i))
end
}
x.inject(:+)
end
我不知道阵列中可能包含的项目数量,因为您可以看到splat运算符。然后我遍历每个数组项并检查它是否是整数。如果不是,则删除它。最后只剩下整数后,对数组求和。
但是,我一直收到以下错误。
没有将Fixnum隐式转换为String(TypeError)
(这个错误引用了注入线。我知道我在这里做错了吗?
答案 0 :(得分:6)
有一个可爱的解决方案: -
your_array.grep(Integer).reduce(0, :+)
因此,请将您的方法实现为:
def sum(*x)
x.grep(Integer).reduce(0, :+)
end
阅读#grep
以了解其工作原理。
返回枚举中每个元素的数组,其中Pattern ===元素。如果提供了可选块,则将每个匹配元素传递给它,并将块的结果存储在输出数组中。
答案 1 :(得分:2)
x.each
遍历数组的每个索引,就像在方法应用时一样。假设你有x = ["a", "b", "c"]
。在x.each
上的第一次迭代中,i
与代码中的"a"
一样,在{0}处从x
删除此元素,使其成为["b", "c"]
。迭代转到索引1
,i
现在是"c"
索引1.这里,迭代跳过了"b"
。因此,您打算检查的x
包含非整数的元素,并且在执行inject(:+)
时会出错。
答案 2 :(得分:1)
保持简单!无需修改现有阵列,只需选择所需内容即可!
irb(main):001:0> a=[1,2,"a",3]
=> [1, 2, "a", 3]
irb(main):002:0> a.select {|ax| ax.is_a? Integer}.reduce(0, :+)
=> 6