Prima o poi in Ruby incontri map(&:upcase) e ti chiedi cosa diavolo sia quel &:. È una delle sintassi più eleganti del linguaggio.

%w[ciao mondo].map(&:upcase)   # => ["CIAO", "MONDO"]

# è esattamente equivalente a:
%w[ciao mondo].map { |s| s.upcase }

Il meccanismo: & converte l'oggetto che segue in un blocco. Quando lo applichi a un simbolo, Ruby chiama Symbol#to_proc, che genera un blocco del tipo { |x| x.upcase }. In pratica, "chiama questo metodo su ogni elemento".

Funziona con qualsiasi metodo senza argomenti: .map(&:to_i), .select(&:even?), .reject(&:nil?), .each(&:save).

Puoi usare & anche per passare un blocco già pronto: def stampa(&blocco); blocco.call; end. Ma il caso d'uso quotidiano è quello: trasformare "chiama questo metodo su tutti" in tre caratteri. Idiomatico, conciso, ovunque nel codice Ruby.