2013-09-24 38 views
0

我想迭代一個數組並有條件地增加一個計數器。我使用索引來比較其他數組的元素:每個與索引與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)是一個有效的建設,以及如何使用它?

+0

不能這樣做'(元素及其他).size'? – j03w

+0

@ j03W它不比較具有相同索引的2個元素作爲一對,但返回2個數組的交集。 – leemour

回答

6

紅寶石文檔爲each_with_object

請注意,您不能使用相同的數字,真實或備忘錄假 不可變對象。您會認爲以下內容會返回120,但由於 備忘錄從不更改,所以不會更改。

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

因此each_with_object不適用於整數等不可變對象。

+0

這就是我一直在尋找的答案! – leemour

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 
+0

好點。這是問題的最自然的解決方案,但我詢問'each_with_index.with_object' – leemour

+0

你說得對,它沒有回答。我只是想添加一個替代方案,因爲你的方法看起來有點複雜:) – Stefan