Iterator Block Kürzel

Methoden und insbesondere Enumeratoren und ihre Blöcke werden manchmal viel zu komplex ausgedrückt. Zum Beispiel:

[1, 2, 3 ].map { |number| number.to_s } #=> ["1", "2", "3"]
[1, 2, 3 ].select { |number| number.odd? } #=> [1, 3]

Innerhalb des Blockes wird lediglich nur eine Message an das jeweilige iterierte Fixnum Object gesendet, und das ohne Parameter. Die Logik ist sehr trivial und für diese Art Iteration hat Ruby einen shortcut parat.
Bitte vergleiche die obigen Beispiele mit:

[1, 2, 3 ].map(&:to_s) # => ["1", "2", "3"]
[1, 2, 3 ].select(&:odd?) # => [1, 3]

Es ist allgemein üblich shortcuts für alle Iteratoren zu verwenden, deren Empfänger (das iterierte Objekt) nur eine message (Methodenaufruf) innerhalb des Blocks erwartet, und die wiederum keinen Parameter erwartet.
Das kann umgesetzt werden, indem die message als Symbol mit einem vorgestellten kaufmännischen Und (&) übergeben wird.
Es sei darauf hingewiesen, dass der shortcut nicht nur für Enumeratoren gilt.
Obwohl er auch für jede Methode verwendet werden kann, die einen Block erwartet:

class Product
  attr_reader :name

  def initialize name
    @name = name
  end

  def humanize
    "Produkt: #{yield(self)}"
  end
end

product = Product.new 'Mango'
product.humanize { |product| product.name } # => "Produkt: Mango"
# oder kürzer:
product.humanize(&:name) # => "Produkt: Mango"

ist es gebräuchlicher und definitiv mächtiger im Zusammenspiel mit Enumeratoren.