2016-06-30 12 views
3

Wie Sie vielleicht wissen, hat Ruby einen Shorthand-Operator &, mit dem wir einfach eine Symbol in eine Proc konvertieren können. Beispiel:Ruby unary operator `&` nur gültig für Methodenargumente

%w(a b c).map(&:upcase) #=> ["A", "B", "C"] 

wäre gleichbedeutend mit:

%w(a b c).map { |c| c.upcase } #=> ["A", "B", "C"] 

Und die Erklärung ist, dass &:upcaseto_proc auf :upcase ruft ein Proc Objekt zu erstellen.

Also, das erklärt ziemlich viel, was der Operator tut, wenn es als letztes Argument einer Methode verwendet wird.

Allerdings sieht aus wie es nicht möglich ist, außerhalb der params eines Methodenaufruf den Bediener überall zu verwenden:

:upcase.to_proc => #<Proc:0x007febbc85ab38(&:upcase)> 
&:upcase   => SyntaxError: syntax error, unexpected & 

Das wäre schön gewesen, wie diese zu nutzen:

case number 
when &:even? 
    # ... 
when &:prime? 
    # ... 
end 

Dies funktioniert obwohl:

case number 
when :even?.to_proc 
    # ... 
when :prime?.to_proc 
    # ... 
end 

kurz gesagt, die unären Operator & kann auf B. in arr.map(&:upcase) verwendet werden. Was ist der Grund dafür?

+0

Mögliche Duplikate von [was ist die Funktionalität von "&:" Operator in Ruby?] (Http://stackoverflow.com/questions/9429819/what-is-the-funktionality-of-operator-in-ruby) –

+0

Was Sie als Methodenargument denken, ist in der Tat ein Blockparameter der Methode - 'Symbol # to_proc' wird aufgerufen, wenn' & 'on symbol verwendet wird, und der resultierende Prozess wird als Blockparameter verwendet –

+0

Dies ist kein Duplikat dieser Frage. Ich frage nicht, was die Funktionalität des Operators ist, die Frage selbst erklärt das grob. Ich bin interessiert zu wissen, warum dies nur in einem bestimmten Kontext (d. H. Methodenargumente) verfügbar ist. – xuuso

Antwort

8

Der & unären Präfix Ampersand Operator „entpackt“ a Proc (oder ein Objekt, das durch Senden der Nachricht an ein to_procProc umgewandelt werden kann) in einen Block, vorbei an es, als ob es als einen Block übergeben worden war. Nur Nachrichtensenden können Blockargumente haben, daher ist der & unäre Präfix und der Undsoperator nur für das letzte Argument in einer Argumentliste zu einer Nachricht erlaubt.

Ebenso "verpackt" der "duale" unäre Präfix Ampersandoperator einen Block in eine Proc und ist daher nur für den letzten Parameter in einer Parameterliste einer Block- oder Methodendefinition zulässig.

+0

': upcase' in' &: upcase' ist ein Symbol - kannst du bitte deinen phaser erklären - entpacke einen 'Proc' in einen Block - in diesem Zusammenhang. –

+1

'&' ist keine allgemeine Abkürzung für 'to_proc'. Seine Verwendung ist spezifisch, um Argumente für Methodenaufrufe zu blockieren. "Unäres Ampersand" ist kein Operator außerhalb dieses Kontextes. – meagar

+1

@Wand, in '[" oh "," my "]. Map (&: upcase)' '&' konvertiert die durch das Symbol ': upcase' dargestellte Methode in einen proc * und * ruft dann diesen proc auf. –

Verwandte Themen