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.