next up previous contents index
Search Next: Iteratoren für Hashtabellen Up: Arrays und Hashtabellen Previous: Hashtabellen erzeugen und verwalten   Contents   Index

Auf Hashelemente zugreifen

Der Zugriff auf einzelne Elemente einer Hashtabelle erfolgt über verschiedene Möglichkeiten. Mit hash[key] erhält man den zum Schlüssel key gehörenden Wert. Sollte key in der Hashtabelle nicht als Schlüssel verwendet worden sein, wird der Standardwert geliefert (normalerweise nil, kann aber der new-Methode mitgegeben (siehe oben) oder per default-Methode geändert werden). Wie bei Arrays kann mit indexes ein Array mit mehreren Einträgen erzeugt werden. has_key? und has_value? entsprechen der include?-Methode bei Arrays; sie ergeben true, wenn der Schlüssel bzw. Wert in der Hashtabelle enthalten ist, false sonst.

h["a"]               #-> 1
h["a"] = 0           #-> 0
h.indexes("a", "b")  #-> [0, 2]
h.has_key?(0)        #-> false
h.has_value?(0)      #-> true
h.index(0)           #-> "a"

Mit index wird der zu einem Wert gehörige Schlüssel geliefert, so dass sowohl bei Arrays als auch bei Hashtabellen gilt:

collection[collection.index(value)] == value

Mit der shift-Methode kann ein Element aus der Hashtabelle entfernt werden. Da Hashes aber keine feste Reihenfolge besitzen, ist der Rückgabewert dieser Methode nicht absehbar. Hingegen erlaubt delete die gezielte Entfernung eines Elements mit einem bekannten Schlüsselwert.

h = {"a"=>1, "b"=>2, "c"=>3}
h.shift              #-> ["a", 1]
h.delete("b")        #-> 2
h                    #-> {"c"=>3}


\epsfig{height=36pt,file=images/chan.eps}Im Ruby Application Archive [RAA] gibt es ein Modul PseudoHash, mit dem einer Hash-ähnlichen Datenstruktur eine kanonische Reihenfolge mitgegeben werden kann, so dass die Ergebnisse von shift wieder einfach vorherzusagen sind. \epsfig{height=10pt,file=images/ruby.eps}

Ruby bietet noch eine sehr flexible Methode an, um Werte aus Hashtabellen zu holen: fetch.

h = Hash.new('nein')
h[2]                #-> "nein"
h.fetch(2)          #-> IndexError
h.fetch(2, -37)     #-> -37
h.fetch(2) { |key|
  "#{key} not found"
}                   #-> "2 not found"

Wenn der Schlüssel nicht vorhanden ist, erzeugt fetch eine Ausnahme, die aufgefangen werden kann. Alternativ dazu kann man einen vom üblichen Standardwert abweichenden Ersatzwert angeben oder einen Codeblock verwenden, der ausgeführt wird, wenn der Schlüssel nicht existiert.


next up previous contents index
Search Next: Iteratoren für Hashtabellen Up: Arrays und Hashtabellen Previous: Hashtabellen erzeugen und verwalten   Contents   Index
(C) 2002 by dpunkt.de, Armin Roehrl, Stefan Schmiedl, Clemens Wyss 2002-01-20