每个都带有Ruby中的对象索引

时间:2013-09-24 12:48:32

标签: ruby

我试图迭代一个数组并有条件地增加一个计数器。我使用索引来比较其他数组的元素:

elements.each_with_index.with_object(0) do |(element, index), diff|
  diff += 1 unless other[index] == element
end

即使无条件更改值,我也无法让diff更改值。 这可以通过inject

解决
elements.each_with_index.inject(0) do |diff, (element, index)|
  diff += 1 unless other[index] == element
  diff
end

但我想知道.each_with_index.with_object(0)是否是一个有效的构造以及如何使用它?

2 个答案:

答案 0 :(得分:6)

来自each_with_object

的ruby文档
  

请注意,您不能使用数字,true或false等不可变对象   作为备忘录。你会认为以下返回120,但自从   备忘录永远不会改变,但事实并非如此。

     

(1..5).each_with_object(1){| value,memo |备忘录* =价值}#=> 1

因此each_with_object不适用于整数等不可变对象。

答案 1 :(得分:2)

你想要计算元素明智差异的数量,对吗?

elements = [1, 2, 3, 4, 5]
other    = [1, 2, 0, 4, 5]
#                 ^

我使用Array#zip将数组元素和Array#count结合起来计算不等对:

elements.zip(other).count { |a, b| a != b }  #=> 1