array = [1, 2, 3, 4, 5, 3, 6, 7, 2, 8, 1, 9]
array.each_with_index.reduce({}) do |hash, (item, index)|
hash[item] = (hash[item] || []) << index
hash
end.select do |key, value|
value.size > 1
end
Прежде всего, более понятный способ записи. Перечислим одну строку, заключенную в {}
, и многострочную do; end
.
array.each_with_index.reduce({}) do |hash, (item, index)|
# hash[item] gets either itself and if itself is nil it gets an empty
# array assigned and additionally the index gets added to this array
hash[item] = (hash[item] || []) << index
# return the hash for the reduce enumerator
hash
end
В этой части вы перебираете массив и передаетеначальный пустой хеш с .reduce({})
.Затем хэш преобразуется и возвращается в L3 в «цикле» и передается в следующую итерацию reduce
.Тогда ваш результат - это компоновка hash
, которая затем сразу же перечисляется с select
, где возвращаются только пары ключ-значение, размер которых больше 1.
Лучше всего будет считывание на Перечислители # уменьшают и то, как объекты передаются в «цикл».