Die Programmiersprache Ruby (German Edition)
Operator
[]
der Klasse
Hash
selber erstellt werden:
{ :one => 1, :two => 2 } # Einfacher Hash als Literal
{ :one, 1, :two, 2 } # Das Gleiche in der veralteten 1.8-Syntax
{ one: 1, two: 2 } # Diesmal in 1.9-Syntax. Schlüssel sind Symbole.
{} # Ein neues, leeres Hash-Objekt
Hash.new # => {}: Erstellt leeren Hash
Hash[:one, 1, :two, 2] # => {one:1, two:2}
Erinnern Sie sich aus „6.4.4 Hashes für benannte Argumente“ daran, dass Sie die geschweiften Klammern um ein Hash-Literal weglassen können, wenn es das letzte Argument beim Aufruf einer Methode ist.
puts :a=>1, :b=>2 # Geschweifte Klammern beim Aufruf weggelassen
puts a:1, b:2 # Das geht auch in 1.9-Syntax
9.5.3.2 Hashes indexieren und Vorhandensein von Elementen prüfen
Hashes sind sehr effizient, wenn es um das Suchen von Werten geht, die mit einem gegebenen Schlüssel verbunden sind. Es ist auch möglich (obschon nicht effizient), einen Schlüssel zu einem gegebenen Wert zu finden. Beachten Sie allerdings, dass viele Schlüssel auf den gleichen Wert zeigen können, womit der zurückgegebene Schlüssel in diesem Fall eher zufällig gewählt ist:
h = { :one => 1, :two => 2 }
h[:one] # => 1: finde Wert zu einem Schlüssel
h[:three] # => nil: der Schlüssel existiert in diesem Hash nicht
h.assoc :one # => [:one, 1]: finde Schlüssel/Wert-Paar. Ruby 1.9.
h.index 1 # => :one: suche nach Schlüssel zu einem Wert
h.index 4 # => nil: kein Schlüssel zu diesem Wert vorhanden
h.rassoc 2 # => [:two, 2]: Schlüssel/Wert-Paar über Wert suchen. Ruby 1.9.
Hash
definiert diverse synonyme Methoden zum Testen der Anwesenheit:
h = { :a => 1, :b => 2 }
# Prüfe auf Anwesenheit von Schlüsseln in einem Hash: schnell
h.key?(:a) # true: :a ist ein Schlüssel in h
h.has_key?(:b) # true: has_key? ist ein Synonym für key?
h.include?(:c) # false: include? ist ein weiteres Synonym
h.member?(:d) # false: member? ist noch ein Synonym
# Prüfe auf Anwesenheit von Werten: langsam
h.value?(1) # true: 1 ist ein Wert in h
h.has_value?(3) # false: has_value? ist ein Synonym für value?
Die Methode
fetch
ist eine Alternative zu
[]
, wenn man Werte in einem Hash sucht. Sie stellt Optionen für den Fall bereit, dass ein Schlüssel in einem Hash nicht vorhanden ist:
h = { :a => 1, :b => 2 }
h.fetch(:a) # => 1: arbeitet für existierende Schlüssel wie []
h.fetch(:c) # Wirft IndexError für nicht bestehende Schlüssel
h.fetch(:c, 33) # => 33: nutzt angegebenen Wert, wenn Schlüssel nicht gefunden wird
h.fetch(:c) {|k| k.to_s } # => "c": ruft Block auf, wenn Schlüssel nicht gefunden wird
Wenn Sie mehr als einen Wert auf einmal aus einem Hash lesen wollen, verwenden Sie
values_at
:
h = { :a => 1, :b => 2, :c => 3 }
h.values_at(:c) # => [3]: Werte werden in einem Array zurückgegeben
h.values_at(:a, :b) # => [1, 2]: beliebig viele Argumente übergeben
h.values_at(:d, :d, :a) # => [nil, nil, 1]
Sie können mit der Methode
select
Schlüssel und Werte auslesen, die durch einen Block ausgewählt werden:
h = { :a => 1, :b => 2, :c => 3 }
h.select {|k,v| v % 2 == 0 } # => [:b,2] Ruby 1.8
h.select {|k,v| v % 2 == 0 } # => {:b=>2} Ruby 1.9
Diese Methode überschreibt
Enumerable.select
. In Ruby 1.8 liefert
select
ein Array mit Schlüssel/Wert-Paaren zurück. In Ruby 1.9 wurde das Verhalten so geändert, dass stattdessen ein Hash mit den ausgewählten Schlüsseln und ihren Werten das Ergebnis ist.
9.5.3.3 Schlüssel und Werte in einem Hash speichern
Verbinden Sie einen Wert mit einem Schlüssel in einem Hash mithilfe des Operators
[]=
oder seinem Synonym, der Methode
store
:
h = {} # Beginne mit einem leeren Hash
h[:a] = 1 # Bilde ab :a=>1; h ist jetzt {:a=>1}
h.store(:b,2) # Ausführlicher: h ist jetzt {:a=>1, :b=>2}
Um alle Schlüssel/Wert-Paare in einem Hash durch die Kopien der Paare eines anderen Hash zu ersetzen, nutzen Sie
replace
:
# Ersetze alle Paare in h durch die aus einem anderen Hash
h.replace({1=>:a, 2=>:b}) # h ist jetzt gleich dem Argument-Hash
Die Methoden
merge
,
merge!
und
update
ermöglichen Ihnen, die Einträge aus zwei Hashes zu kombinieren:
# Hashes h und j in neuen Hash k vereinigen.
# Wenn h und j gemeinsame Schlüssel haben, verwende die Werte aus j
k = h.merge(j)
{:a=>1,:b=>2}.merge(:a=>3,:c=>3) # => {:a=>3,:b=>2,:c=>3}
h.merge!(j) # Verändert h selber.
# Wenn es einen Block gibt, verwende ihn für die Entscheidung, welcher Wert genommen wird
h.merge!(j) {|key,h,j| h } # Verwende Wert von h
h.merge(j) {|key,h,j| (h+j)/2 } # Verwende Mittelwert
# update ist ein Synonym
Weitere Kostenlose Bücher