Die Programmiersprache Ruby (German Edition)
für merge!
h = {a:1,b:2} # 1.9-Syntax
h.update(b:4,c:9) {|key,old,new| old } # h ist jetzt {a:1, b:2, c:9}
h.update(b:4,c:9) # h ist jetzt {a:1, b:4, c:9}
9.5.3.4 Hash-Einträge entfernen
Sie können einen Schlüssel nicht einfach dadurch aus einem Hash entfernen, dass Sie ihn auf
nil
abbilden. Stattdessen verwenden Sie die Methode
delete
:
h = {:a=>1, :b=>2}
h[:a] = nil # h ist jetzt {:a=> nil, :b=>2 }
h.include? :a # => true
h.delete :b # => 2: gib gelöschten Wert zurück. h ist jetzt {:a=>nil}
h.include? :b # => false
h.delete :b # => nil: Schlüssel nicht gefunden
# Block aufrufen, wenn Schlüssel nicht gefunden wird
h.delete(:b) {|k| raise IndexError, k.to_s } # IndexError!
Sie können mehrere Schlüssel/Wert-Paare aus einem Hash mit den Iteratoren
delete_if
und
reject!
entfernen (und mit dem Iterator
reject
, der auf einer Kopie seines Ziels arbeitet). Beachten Sie, dass
reject
die Methode gleichen Namens aus
Enumerable
überschreibt und ein Hash statt eines Array zurückgibt:
h = {:a=>1, :b=>2, :c=>3, :d=>"four"}
h.reject! {|k,v| v.is_a? String } # => {:a=>1, :b=>2, :c=>3 }
h.delete_if {|k,v| k.to_s < 'b' } # => {:b=>2, :c=>3 }
h.reject! {|k,v| k.to_s < 'b' } # => nil: keine Änderung
h.delete_if {|k,v| k.to_s < 'b' } # => {:b=>2, :c=>3 }: unveränderter Hash
h.reject {|k,v| true } # => {}: h ist unverändert
Schließlich können Sie noch alle Schlüssel/Wert-Paare aus einem Hash mit der Methode
clear
entfernen. Diese Methode hat kein Ausrufezeichen, ändert aber trotzdem ihr Ziel:
h.clear # h ist jetzt {}
9.5.3.5 Arrays aus Hashes
Hash
definiert Methoden zum Extrahieren von Hash-Daten in Arrays:
h = { :a=>1, :b=>2, :c=>3 }
# Größe des Hash: Anzahl an Schlüssel/Wert-Paaren
h.length # => 3
h.size # => 3: size ist ein Synonym für length
h.empty? # => false
{}.empty? # => true
h.keys # => [:b, :c, :a]: Array mit Schlüsseln
h.values # => [2,3,1]: Array mit Werten
h.to_a # => [[:b,2],[:c,3],[:a,1]]: Array mit Paaren
h.flatten # => [:b, 2, :c, 3, :a, 1]: Flaches Array; Ruby 1.9
h.sort # => [[:a,1],[:b,2],[:c,3]]: Sortiertes Array mit Paaren
h.sort {|a,b| a[1]<=>b[1] } # Sortiere Paare nach Wert statt nach Schlüssel
9.5.3.6 Hash-Iteratoren
Es ist normalerweise nicht notwendig, Hash-Schlüssel, -Werte oder -Paare als Array zu extrahieren, da die Klasse
Hash
das Modul
Enumerable
einbindet und auch andere nützliche Iteratoren definiert. In Ruby 1.8 geben
Hash
-Objekte keine Garantien über die Reihenfolge ab, in der ihre Werte iteriert werden. In Ruby 1.9 werden Hash-Elemente dagegen in der Reihenfolge ihres Einfügens iteriert, wie man in den folgenden Beispiele sehen kann:
h = { :a=>1, :b=>2, :c=>3 }
# Der Iterator each() iteriert über [Schlüssel,Wert]-Paare
h.each {|pair| print pair } # Ausgabe "[:a, 1][:b, 2][:c, 3]"
# Er funktioniert auch mit zwei Blockargumenten
h.each do |key, value|
print "#{key}:#{value} " # Ausgabe "a:1 b:2 c:3"
end
# Iteriere über Schlüssel, Werte oder beides
h.each_key {|k| print k } # Ausgabe "abc"
h.each_value {|v| print v } # Ausgabe "123"
h.each_pair {|k,v| print k,v } # Ausgabe "a1b2c3"; wie each
Der Iterator
each
gibt ein Array aus Schlüssel und Wert zurück. Durch die Aufrufsyntax von Blöcken kann dieses Array automatisch zu einzelnen Parametern für den Schlüssel und den Wert expandiert werden. In 1.8 stellt der Iterator
each_pair
die Schlüssel und Werte als zwei getrennte Werte bereit (was einen kleinen Performancevorteil haben kann). In Ruby 1.9 ist
each_pair
einfach ein Synonym für
each
.
Auch wenn die Methode
shift
kein Iterator ist, kann sie genutzt werden, um über die Schlüssel/Wert-Paare eines Hash zu iterieren. Wie die Array-Methode gleichen Namens entfernt sie ein Element und liefert es (in diesem Fall ein Array
[key,value]
) aus dem Hash zurück:
h = { :a=> 1, :b=>2 }
print h.shift[1] while not h.empty? # Ausgabe "12"
9.5.3.7 Standardwerte
Wenn Sie den Wert eines Schlüssels abfragen, dem kein Wert zugewiesen wurde, erhalten Sie normalerweise den Wert
nil
:
empty = {}
empty["one"] # nil
Sie können dieses Verhalten allerdings ändern, indem Sie einen Standardwert für den Hash festlegen:
empty = Hash.new(-1) # Festlegen eines Standardwerts beim Anlegen des Hashs
empty["one"] # => −1
empty.default = −2 # Ändern des Standardwerts auf etwas anderes
empty["two"] # => −2
empty.default # => −2: Rückgabe des Standardwerts
Anstatt einen einzelnen Standardwert bereitzustellen, können Sie auch einen Codeblock angeben, um die Werte für
Weitere Kostenlose Bücher