0

我正在尝试迭代一个数组并有条件地增加一个计数器。我正在使用索引与其他数组的元素进行比较:

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)是一个有效的结构以及如何使用它?

4

2 回答 2

6

来自each_with_object的 ruby​​ 文档

请注意,您不能使用不可变对象(如数字、真或假)作为备忘录。您可能会认为以下返回 120,但由于备忘录从未更改,因此不会。

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

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

于 2013-09-24T13:06:47.360 回答
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
于 2013-09-24T13:12:24.373 回答