2012-02-24 8 views
25

Eventuali duplicati:
What does map(&:name) mean in Ruby?qual è la funzionalità dell'operatore "&:" in ruby?

mi sono imbattuto in un frammento di codice che ha avuto il seguente

a.each_slice(2).map(&:reverse) 

Non conosco la funzionalità di &: dell'operatore. Come funziona?

+0

Questo è un duplicato di altri meno di 17 domande che sono state già chiesto e ha risposto qui su StackOverflow: [Understanding \ [ClassOne , ClassTwo \] .each \ (&: my_method \)] (http://StackOverflow.Com/q/99318/), [Cosa significa 'map (&: name)' in Ruby?] (Http: // StackOverflow.Com/q/1217088/), [Che cosa è esattamente '&: capitalize' in Ruby?] (Http://StackOverflow.Com/q/1792683/), [Ruby/Ruby on Rails e una scorciatoia del colon] (http : //StackOverflow.Com/q/1961030/), [Ruby: '&: symbol' syntax] (http://StackOverflow.Com/q/2096975/), ... –

+0

... [Cos'è questo '&: last' Ruby Construct Called?] (Http://StackOverflow.Com/q/2211751/), [Come si chiama l'operatore' &: 'in Ruby?] (Http://StackOverflow.Com/q/2259775/), [cosa fa 'map (&: name)' fa in questo codice Ruby?] (Http://StackOverflow.Com/q/2388337/), [Cosa sono ': + 'e' & + 'in ruby?] (http://StackOverflow.Com/q/2697024/), [' &: views_count' in 'Post.published.collect (&: views_count)'] (http: // StackOverflow.Com/q/3888044/), [Sintassi di Ruby Proc] (http://StackOverflow.Com/q/4512587/), [Come funziona "(1..4) .inject (&: +)' " lavoro in Ruby] (http://StackOverflow.Com/q/5003257/), ... –

+0

... [Cosa significa la seguente istruzione '&: property'?] (http://StackOverflow.Com/q/5620411/), [ Cosa significa '&' nella seguente sintassi del ruby?] (Http://StackOverflow.Com/q/5952175/), [Perché si dovrebbe usare l'operatore unario su una proprietà in ruby? es. '&: first'] (http://StackOverflow.Com/q/6289084/), [in che modo' Array # map' ha parametri per fare qualcosa del genere?] (http://StackOverflow.Com/q/ 6716629 /), e [cosa significa '&:' significa in ruby, è un blocco combinato con un simbolo?] (Http://StackOverflow.Com/q/9188362/). –

risposta

60

Non c'è un operatore &: in Ruby. Quello che stai vedendo è l'operatore & applicato a un :symbol.

Nell'elenco metodo argomento, l'operatore prende il & operando, lo converte in un oggetto Proc se non è già (chiamando to_proc su di esso) e lo passa al metodo come se fosse stato usato un blocco.

my_proc = Proc.new { puts "foo" } 

my_method_call(&my_proc) # is identical to: 
my_method_call { puts "foo" } 

Quindi la questione ora diventa "Che cosa Symbol#to_proc fare?", E che è facile da vedere in the Rails documentation:

Attiva il simbolo in un semplice proc, che è particolarmente utile per le enumerazioni. Esempi:

# The same as people.collect { |p| p.name } 
people.collect(&:name) 

# The same as people.select { |p| p.manager? }.collect { |p| p.salary } 
people.select(&:manager?).collect(&:salary) 
+3

Lo stai implicando, ma sarebbe meglio dirlo esplicitamente: questa è una modifica che fa Rails, e non è integrata in Ruby stessa. – kikito

+5

@kikito: http://ruby-doc.org/core-1.9.3/Symbol.html#method-i-to_proc – tokland

+0

Hai ragione - l'ho appena provato in plain irb (1.8.7), è in Ruby stessa. Questo non è fornito da Rails. Grazie per aver corretto il mio errore! – kikito

18

Con anteponendo & ad un simbolo che si sta creando una funzione lambda che chiamerà il metodo con un nome di quel simbolo sull'oggetto che si passa in questa funzione. Tenendo conto di:

ar.map(&:reverse) 

è più o meno equivalente a:

ar.map { |element| element.reverse } 
+2

Si prega di non rispondere a domande doppie. Basta votare per chiudere. Questa domanda è stata già posta e ha risposto 17 (!!!) volte, non c'è davvero * nulla * ottenuto diffondendo la conoscenza ancora di più. –

+10

Ho visto una domanda e ho risposto. È stato contrassegnato come duplicato solo dopo. –

Problemi correlati