只汇总数组中的整数(Ruby)

时间:2014-08-16 05:52:10

标签: ruby

我试图仅对传递给我的函数的数组中的整数求和,但仍然遇到错误。这就是我现在所拥有的。

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)

(这个错误引用了注入线。我知道我在这里做错了吗?

3 个答案:

答案 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"]。迭代转到索引1i现在是"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