Was ist das letzte Ruby-Konstrukt?

Mögliche Duplikate:
Was bedeutet map (&: name) in Ruby?

Was sind Dinge wie survey.map(&:questions).flatten.compact aufgerufen, damit ich mehr Informationen über sie finden kann :). Welche Probleme hat das &: lösen, oder was macht es genau? Wird es in anderen Sprachen verwendet?

Dies ist eine Abkürzung für:

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

Es ist die Symbol#to_proc Methode. Es war ein Teil von Rails ‘ActiveSupport, wurde aber seither zur Ruby-Syntax hinzugefügt.

Was die performance angeht, habe ich ein schnelles Benchmark-Skript geschrieben, um eine Vorstellung von dem performanceseffekt in 1.8 und 1.9 zu bekommen.

 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 

Zunächst einmal, bevor Sie die Ergebnisse gaben – wenn Sie nicht sicher waren, dass Ruby 1.9 im Allgemeinen eine enorme Geschwindigkeitsverbesserung war, sollten Sie sich darauf gefasst machen, dass Sie weg sind.

Ruby 1.8 Ergebnisse:

  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 Ergebnisse:

  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) 

Erstens: Wow. Ruby 1.9 ist schnell. Aber die relevanteren Schlussfolgerungen, die wir hier ziehen, sind interessant:

  • In beiden Fällen ist to_proc für nur einen Lauf deutlich schneller. In 1.8 auf dem mehrfachen Lauf ist es etwas langsamer. Dies scheint darauf hinzuweisen, dass der einzige wirkliche performancesengpass die Erstellung all dieser Proc-Objekte ist.
  • In Ruby 1.9 ist die to_proc Methode jedoch deutlich schneller als Blöcke, egal wie oft Sie es tun. In diesem Fall erhalten Sie nicht nur saubereren Code, sondern auch eine verbesserte performance.

Am Ende ist es egal, welche Version Sie verwenden, to_proc ist eindeutig nicht genug für ein performancesproblem, das es wert ist, nicht verwendet zu werden – in der Tat beschleunigt es manchmal Dinge!