InhaltsverzeichnisKlicke auf den Link, um zur gewünschten Stelle zu navigieren
Dieser Inhalt wurde automatisch aus dem Ukrainischen übersetzt.
In Ruby gibt es oft eine verkürzte Schreibweise für Iterationen:
[1, 2, 3].map(&:to_s)
Das ist dasselbe wie:
[1, 2, 3].map { |n| n.to_s }
Aber wie funktioniert die Konstruktion &:to_s genau?
Symbol#to_proc
Die Schlüsselidee ist, dass Ruby es ermöglicht, Symbole mit der Methode to_proc in Blöcke zu konvertieren.
- Das Symbol :to_s repräsentiert den Namen der Methode.
- Die Methode to_proc verwandelt ein Symbol in einen Block, der die entsprechende Methode auf jedem Element der Sammlung aufruft.
- Der Operator & teilt Ruby mit, dass dieser Block an die Methode (map, each usw.) übergeben werden soll.
Man kann das so sehen:
s = :to_s p = s.to_proc [1, 2, 3].map(&p) # => ["1", "2", "3"]
Das heißt &:to_s ist eine verkürzte Schreibweise für &(:to_s.to_proc)
Wenn man es einfach sagt:
Wenn wir &:to_s schreiben, nimmt es jedes Element des Arrays und ruft darauf die Methode to_s auf.
Das heißt, diese Schreibweise:
[1, 2, 3].map(&:to_s)
bedeutet dasselbe wie:
[1, 2, 3].map { |n| n.to_s }
&:to_s ist einfach eine kurze Möglichkeit zu sagen "rufe die Methode to_s auf jedem Element auf". Ruby "entfaltet" dieses Symbol selbst in einen normalen Block.
Beispiele
1. Umwandlung von Zahlen in Strings
numbers = [1, 2, 3] strings = numbers.map(&:to_s) # => ["1", "2", "3"]
2. Aufruf anderer Methoden
words = ["hello", "world"] capitalized = words.map(&:upcase) # => ["HELLO", "WORLD"]
3. Aufruf eigener Methoden des Objekts
class Person
attr_reader :name
def initialize(name)
@name = name
end
end
people = [Person.new("Alice"), Person.new("Bob")]
names = people.map(&:name)
# => ["Alice", "Bob"]
Wie KI gerne schreibt - Fazit:
- &:method_name ist eine verkürzte Schreibweise für &(:method_name.to_proc).
- Ruby wandelt ein Symbol in einen Block um, indem es Symbol#to_proc verwendet, der die Methode auf jedem Element der Sammlung aufruft.
- Das macht den Code kürzer und lesbarer.
Die Konstruktion &:to_s oder &:name ist sehr praktisch für Sammlungen, wenn man eine Methode auf allen Elementen aufrufen möchte.
Dieser Beitrag hat noch keine Ergänzungen vom Autor.