342 Stimmen

Ruby Abkürzung für Ampersand und Doppelpunkt

Mögliches Duplikat:
Was bedeutet map(&:name) in Ruby?

In Ruby weiß ich, dass wenn ich das tue:

some_objects.each(&:foo)

Es ist dasselbe wie

some_objects.each { |obj| obj.foo }

Das heißt, &:foo erstellt den Block { |obj| obj.foo } verwandelt ihn in einen Proc und gibt ihn an jeden weiter. Warum funktioniert das? Ist das nur ein Sonderfall von Ruby, oder gibt es einen Grund, warum das so funktioniert?

508voto

August Lilleaas Punkte 52649

Ihre Frage ist sozusagen falsch. Hier geht es nicht um "kaufmännisches Und und Doppelpunkt", sondern um "kaufmännisches Und und Objekt". Der Doppelpunkt steht in diesem Fall für das Symbol. Also gibt es & und es gibt :foo .

En & ruft auf. to_proc auf das Objekt und übergibt es als Block an die Methode. In Ruby, to_proc ist implementiert auf Symbol , so dass diese beiden Aufrufe gleichwertig sind:

something {|i| i.foo }
something(&:foo)

Zusammenfassend lässt sich also feststellen: & ruft auf. to_proc auf das Objekt und übergibt es als Block an die Methode, und Ruby implementiert to_proc en Symbol .

93voto

Michiel de Mare Punkte 41184

Die Kombination aus dem kaufmännischen Und-Zeichen und dem Symbol ist nichts Besonderes. Hier ist ein Beispiel, das die Regex (ab)nutzt:

class Regexp
  def to_proc
    ->(str) { self =~ str ; $1 }
  end
end
%w(station nation information).map &/(.*)ion/

=> ["stat", "nat", "informat"]

Oder ganze Zahlen.

class Integer
  def to_proc
    ->(arr) { arr[self] }
  end
end

arr = [[*3..7],[*14..27],[*?a..?z]]
arr.map &4
=> [7, 18, "e"]

Wer braucht arr.map(&:fifth) wenn Sie arr.map &4 ?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X