2009-11-24 24 views
5

Ho appena letto questa risposta Converting upper-case string into title-case using Ruby.Che cosa è esattamente `&: capitalize` in Ruby?

C'è la seguente riga di codice

"abc".split(/(\W)/).map(&:capitalize).join 

Che cosa è esattamente &:capitalize? Prima di aver messo questo in irb me stesso, ti avrei detto, non è una sintassi ruby ​​valida. Deve essere una specie di oggetto Proc, perché il numero Array#map prende un blocco. Ma non lo è. Se lo metto in irb da solo, ottengo syntax error, unexpected tAMPER.

+0

Il motivo per cui non funziona in irb per te è probabilmente perché, come dice sepp2k, è stato solo inserito nella libreria standard in Ruby 1.8.7, e suppongo che tu stia utilizzando una versione precedente. Lo vedi piuttosto spesso, perché anche ActiveSupport lo lancia e ActiveSupport viene fornito con Rails. Se lo provi nello script/console di Rails, probabilmente scoprirai che funziona. –

+0

possibile duplicato di [Cosa significa map (&: name) in Ruby?] (Http://stackoverflow.com/questions/1217088/what-does-mapname-mean-in-ruby) –

risposta

6

foo(&a_proc_object) gira a_proc_object in un blocco e chiama foo con quel blocco.

foo(&not_a_proc_object) chiama to_proc su not_a_proc_object e quindi trasforma l'oggetto proc restituito da to_proc in un blocco e chiama foo con quel blocco.

In ruby ​​1.8.7+ e il supporto attivo Symbol#to_proc è definito per restituire un proc che chiama il metodo denominato dal simbolo sull'argomento al proc.