J'ai effectué quelques tests rapides sur certaines des réponses données. (Ces résultats peuvent ne pas être exactement identiques aux vôtres en fonction de la version de Ruby, de la mise en cache bizarre, etc. mais les résultats généraux seront similaires).
arr
est une collection d'objets ActiveRecord.
Benchmark.measure {
100000.times {
Hash[arr.map{ |a| [a.id, a] }]
}
}
Benchmark @real=0.860651, @cstime=0.0, @cutime=0.0, @stime=0.0, @utime=0.8500000000000005, @compensation0.85000000000005
Benchmark.measure {
100000.times {
h = Hash[arr.collect { |v| [v.id, v] }]
}
}
Benchmark @real=0.74612, @cstime=0.0, @cutime=0.0, @stime=0.010000000000000009, @utime=0.740000000000002, @courrier0.750000000000002
Benchmark.measure {
100000.times {
hash = {}
arr.each { |a| hash[a.id] = a }
}
}
Benchmark @real=0.627355, @cstime=0.0, @cutime=0.0, @stime=0.010000000000000009, @utime=0.6199999999999974, @circuit de vente de produits de consommation 0.6299999999999975
Benchmark.measure {
100000.times {
arr.each_with_object({}) { |v, h| h[v.id] = v }
}
}
Benchmark @real=1.650568, @cstime=0.0, @cutime=0.0, @stime=0.12999999999999998, @utime=1.51, @livraison1.64
En conclusion
Ce n'est pas parce que Ruby est expressif et dynamique qu'il faut toujours opter pour la plus belle solution. La boucle de base each a été la plus rapide pour créer un hash.