Cos’è questo e: l’ultimo costrutto Ruby chiamato?

Possibile duplicato:
Cosa significa map (&: name) in Ruby?

Cosa sono survey.map(&:questions).flatten.compact , così posso trovare ulteriori informazioni su di loro :). Che problemi ha questo &: risolvere, o cosa sta facendo esattamente? È usato in altre lingue?

Questa è una scorciatoia per:

 survey.map { |s| s.questions }.flatten.compact 

È il metodo Symbol#to_proc . Un tempo faceva parte di ActiveSupport di Rails, ma da allora è stato aggiunto alla syntax di Ruby.

Per quanto riguarda le prestazioni, ho scritto uno script di benchmark rapido per avere un’idea dell’effetto delle prestazioni sia in 1.8 che in 1.9.

 require 'benchmark' many = 500 a = (1..10000).to_a Benchmark.bm do |x| x.report('block once') { a.map { |n| n.to_s } } x.report('to_proc once') { a.map(&:to_s) } x.report('block many') { many.times { a.map { |n| n.to_s } } } x.report('to_proc many') { many.times { a.map(&:to_s) } } end 

Prima di tutto, prima di darti i risultati – se non eri già sicuro che Ruby 1.9 fosse un enorme miglioramento della velocità in generale, preparati a essere spazzato via.

Ruby 1.8 risultati:

  user system total real block once 0.020000 0.000000 0.020000 ( 0.016781) to_proc once 0.010000 0.000000 0.010000 ( 0.013881) block many 6.680000 1.100000 7.780000 ( 7.780532) to_proc many 7.370000 0.540000 7.910000 ( 7.902935) 

Ruby 1.9 risultati:

  user system total real block once 0.010000 0.000000 0.010000 ( 0.011433) to_proc once 0.000000 0.000000 0.000000 ( 0.004929) block many 4.060000 0.000000 4.060000 ( 4.057013) to_proc many 2.810000 0.000000 2.810000 ( 2.810312) 

Prima di tutto: Wow. Ruby 1.9 è veloce. Ma le conclusioni più rilevanti che disegniamo qui sono interessanti:

  • In entrambi i casi, per una sola esecuzione, to_proc è chiaramente più veloce. In 1.8 sulla corsa molte volte, è un po ‘più lento. Ciò sembra indicare che l’unico vero collo di bottiglia delle prestazioni è la creazione di tutti quegli oggetti Proc.
  • In Ruby 1.9, tuttavia, il metodo to_proc è chiaramente molto più veloce dei blocchi, non importa quante volte lo fai. In questo caso, non solo ottieni un codice più pulito, ma anche prestazioni migliorate.

Alla fine, non importa quale versione stai usando, to_proc è chiaramente abbastanza di un problema di prestazioni che vale la pena non usare – anzi, a volte accelera le cose!