2012-01-09 17 views
17

Sono consapevole della scorciatoia per la mappa che assomiglia:Altro Rubino Mappa Stenografia Notazione

[1, 2, 3, 4].map(&:to_s) 
> ["1", "2", "3", "4"] 

mi è stato detto questa è una scorciatoia per:

[1, 2, 3, 4].map{|i| i.to_s} 

Questo ha perfettamente senso. La mia domanda è questa: Sembra che ci dovrebbe essere un modo più semplice di scrivere:

[1, 2, 3, 4].map{|x| f.call(x)} 

per qualche procedura f. So che il modo in cui ho appena digitato non è tanto lungo per cominciare, ma direi che nessuno dei due è l'esempio precedente per cui esiste la stenografia. Questo esempio sembra il complemento del primo esempio: piuttosto che chiamare il metodo to_s di i per ogni i, desidero chiamare f per ogni x.

Esiste una tale stenografia?

+0

È 'f' un metodo esistente che si desidera chiamare? –

risposta

36

Purtroppo questa notazione abbreviata (che chiama "il simbolo # to_proc") non dispone di un modo per passare argomenti al metodo o blocco di essere chiamato, quindi non si poteva nemmeno effettuare le seguenti operazioni:

array_of_strings.map(&:include, 'l') #=> this would fail 

MA, sei fortunato perché non hai davvero bisogno di questa scorciatoia per fare ciò che stai cercando di fare. La commerciale può convertire una o Proc Lambda in un blocco, e viceversa:

my_routine = Proc.new { |str| str.upcase } 
%w{ one two three }.map &my_routine #=> ['ONE', 'TWO', 'THREE'] 

Nota la mancanza del colon prima my_routine. Questo perché non vogliamo convertire il simbolo :my_routine in un proc trovando il metodo e chiamando .method su di esso, piuttosto vogliamo convertire il Proc my_routine in un blocco e passarlo a map.

Sapendo questo, si può anche mappare un metodo Rubino origini:

%w{ one two three }.map &method(:p) 

Il metodo method prenderebbe il metodo p e convertirlo in un Proc, e il & lo converte in un blocco che viene passato a map. Di conseguenza, ogni elemento viene stampato. Questo è l'equivalente di questo:

%w{ one two three }.map { |s| p s } 
+3

Anche se è vero, non sono convinto che l'OP si riterrà "fortunato" a dover definire separatamente il blocco per ottenere una chiamata "più veloce". –

+5

@DaveNewton Non penso che tu capisca la domanda. Sembra che abbia già un Proc o Lambda esistente a cui si riferisce come 'f' nella domanda. Può ottenere quello che vuole con 'array.map (& f)', che in realtà è un personaggio più corto di quello che ha provato. – coreyward