Die Programmiersprache Ruby

Blog| Forum| Wiki  

Das Hash, in Ruby seltener auch Assoziatives Array genannt, ist eine Möglichkeit, Daten unter bestimmten Schlüsseln zu speichern. Ein Hash kann erstellt werden, indem man eine Liste von Schlüssel-Wert-Paaren in geschweifte Klammern {} setzt, die Methode Hash benutzt, oder explizit eine neue Instanz der Klasse Hash erstellt. Anders als Arrays sind Hashes allerdings unsortiert, d.h. ihre Elemente werden nicht in der Reihenfolge ausgegeben, in der sie erstellt wurden.

1
2
3
4
5
{:key1 => "Value1", "key2" => 2, 3 => /3/, [4].freeze => [4]}
Hash[:key1, "Value1", "key2", 2]
hsh = Hash.new
hsh[:key1] = "Value1"
hsh["key2"] = 2

Inhaltsverzeichnis

Default-Value

Hashes haben einen Standardwert, der immer dann zurückgegeben wird, wenn ein nicht definierter Schlüssel abgerufen wird. Wenn er nicht gesetzt ist, ist er nil.

1
2
3
4
5
6
7
8
#Entweder setzt man den Standardwert bereits bei der Erstellung...
x = Hash.new("NIX DA!!")
puts x[:k1] #=> NIX DA!!
#...oder erst sp��ter. 
y = {:k1 => "v1"}
y[:k2] #=> nil
y.default = "NIX DA!!"
y[:k2] #=> NIX DA!!

Warum Symbole als Schlüssel?

Immer, wenn ein anderes Objekt als ein Symbol irgendwie referenziert wird, wird ein neues Objekt erstellt. Ein Symbol aber bleibt im gesamten Programm immer gleich.

1
2
3
4
h1 = {"k1" => 1, "k2" => 2} #Hier werden die Strings "k1" und "k2" erzeugt. 
h1["k1"] #Hier wird der String "k1" erneut erzeugt, als V��LLIG NEUES Objekt. 
h2 = {:k1 => 1, :k2 => 2} #Hier werden die Symbole :k1 und :k2 erzeugt. 
h2[:k1] #Hier wird erneut :k1 abgerufen - aber es ist DASSELBE :k1 wie eine Zeile hierdr��ber.

Array.to_h?

Diese Methode gibt es deshalb nicht, weil sich nicht jedes Array problemlos in ein Hash konvertieren lässt. Wenn man sich jedoch sicher ist, dass das möglich ist, kann man die Methode Hash[] benutzen:

1
2
3
ary = [:k1, 1, :k2, 2]
hsh = Hash[*ary]
p hsh #=> {:k1 => 1, :k2 => 2}

Änderungen an Hash

Hier werden die Veränderungen an der Klasse Hash in Ruby 1.9.1 gelistet.


  • Neue Hashsyntax: Die Zuordnungspfeile können jetzt weggelassen werden, wenn es sich um Symbol-Wert-Paare handelt.
1
2
hsh = {x: 7, y: "ABC"}
p hsh #=> {:x => 7, :y => "ABC"}


  • Hashes sind nun sortiert:
1
2
3
hsh = {"X" => 99, 102 => :T, :Z => (0..9)}
p hsh #=> {"X" => 99, 102 => :T, :Z => 0..9}
p hsh.keys #=> ["X", 102, :Z]


Siehe auch