En el inject
o reduce
Methode, n
stellt einen akkumulierten Wert dar, d. h. das Ergebnis jeder Iteration wird in der n
variabel. Dies könnte, wie in Ihrem Beispiel, die Summe oder das Produkt der Elemente im Array sein.
yield
gibt das Ergebnis des Blocks zurück, das in n
und in den nächsten Iterationen verwendet. Dadurch wird das Ergebnis "kumulativ".
a = [ 1, 2, 3 ]
a.sum # inject(0) { |n, v| n + v }
# n == 0; n = 0 + 1
# n == 1; n = 1 + 2
# n == 3; n = 3 + 3
=> 6
Um die Summe zu berechnen, hätten Sie auch schreiben können a.reduce :+
. Dies funktioniert für jede binäre Operation. Wenn Ihre Methode den Namen symbol
Schreiben a.reduce :symbol
ist dasselbe wie das Schreiben a.reduce { |n, v| n.symbol v }
.
attr
und Unternehmen sind eigentlich Methoden. Unter der Haube definieren sie die Methoden dynamisch für Sie. Es verwendet das von Ihnen übergebene Symbol, um die Namen der Instanzvariablen und der Methoden zu ermitteln. :member
ergibt sich im @member
Instanzvariable und die member
y member =
Methoden.
Der Grund, warum Sie nicht schreiben können attr_reader @member
ist, weil @member
ist weder ein Objekt an sich, noch kann es in ein Symbol umgewandelt werden; es weist Ruby an, den Wert der Instanzvariablen @member
der self
Objekt, das auf Klassenebene die Klasse selbst ist.
Zur Veranschaulichung:
class Example
@member = :member
attr_accessor @member
end
e = Example.new
e.member = :value
e.member
=> :value
Denken Sie daran, dass der Zugriff auf nicht gesetzte Instanzvariablen zu nil
und da die attr
Methode Familie akzeptiert nur Symbole, Sie erhalten: TypeError: nil is not a symbol
.
Betreffend Symbol Nutzung, können Sie gewissermaßen sie wie Schnüre verwenden. Sie eignen sich hervorragend als Hash-Schlüssel, da sich gleiche Symbole im Gegensatz zu Zeichenketten immer auf das gleiche Objekt beziehen.
:a.object_id == :a.object_id
=> true
'a'.object_id == 'a'.object_id
=> false
Sie werden auch häufig verwendet, um auf Methodennamen zu verweisen, und kann tatsächlich umgewandelt werden in Proc
s , die an Methoden übergeben werden können. Dies ermöglicht es uns, Dinge zu schreiben wie array.map &:to_s
.
Auschecken dieser Artikel für weitere Interpretationen des Symbols.