Aprenda os métodos específicos de coleta

Enumerable tem muitas coisas legais e geralmente é o primeiro lugar para onde as pessoas olham quando fazem algo não trivial. Porém, não se esqueça dos métodos específicos de coleção!

Minha primeira passagem em um método era assim:

def random_indices
even
, odd = partition_by_parity
if even.any?
[even[rand(even.size)]]
elsif odd.any?
if odd.size == 1
[odd.first]
else
i1
= odd[rand(odd.size)]
odd
-= i1
i2
= odd[rand(odd.size)]

[i1, i2]
end
else
[]
end
end

Agora se parece com isto:

def random_indices
even
, odd = partition_by_parity.map(&:shuffle)
even
.any? ? even.take(1) : odd.take(2)
end

Disse o suficiente.