Iteratoren |
|
Beispiel: Adressbuch |
Die nächste Klasse, auf die wir einen Blick werfen, ist Hash.
Hashes sind eine Verallgemeinerung von Arrays. Statt nur ganze Zahlen als Indizes zuzulassen, wie z.B. bei array[3], erlauben Hashes irgendein Objekt als "index" zu benutzen. Somit können Sie hash["name"] schreiben.
Wir wollen nun einige Informationen über einen Freund speichern. Wir könnten ein Array benutzen wie folgt:
freund = [ "Herbert", "Maier", "Auf Maien 69", "Neunkirchen", "Saarland" ] |
Das würde gehen, aber wir müssten uns merken, dass z.B. freund[0] der Vorname ist, freund[1] der Nachname usw. . Es könnte noch komplizierter kommen.
Das ist genau das Problem, wo ein Hash weiterhelfen kann. So definiert man ein Hash:
freund = { "vorname" => "Herbert", "nachname" => "Maier", "adresse" => "Auf Maien 69", "stadt" => "Neunkirchen", "bundesland" => "Saarland" } |
Genauso wie bei Arrays können Sie ein neues Feld wie folgt hinzufügen:
freund["land"] = "Deutschland" |
Achtung: Beachten Sie, dass Sie Hashes mit geschweiften Klammern { ... } statt mit eckigen Klammern [ ... ] wie bei den Arrays erstellen können. |
Da Hases keine numerischen Indizes benutzen, benutzen wir das Wort Schlüssel (keys) stattdessen. Die Objekte, auf die die Schlüssel zeigen, werden Werte (values) genannt.
Im obigen Beispiel sind demnach "vorname", "nachname" und "stadt" Schlüssel. Ihre entsprechenden Werte sind "Herbert", "Maier" und "Neunkirchen".
Hashes haben auch Iteratoren.
Hashes haben die Methode Hash#each, ähnlich zu Array#each. Diese Methode liefert jedoch den Schlüssel als auch den Wert.
freund.each do |key, value| puts key + " => " + value end |
Das ergibt:
stadt => Neunkirchen nachname => Maier land => Deuschland bundesland => Saarland adresse => Auf Maien 69 vorname => Herbert |
Das zeigt uns einen Nachteil von Hashes. Die Daten in Hashes sind nicht in irgendeiner bestimmten Reihenfolge angeordnet. Gibt es einen Grund, warum Ruby wissen sollte, dass "vorname" vor "stadt" kommt? Nein.
Der beste Weg, um mit dieser Art von Problem umzugehen, ist das Erstellen einer Klasse, die sich um dieses Problem kümmert. Ruby ist eine exzellente Sprache, um Ihre eigene Klasse zu erstellen. Aber zuvor müssen wir noch auf anderes Material eingehen. Klassen und Mathoden erstellen, ist das Thema des nächsten Kapitels.
Hash#each_pair ist ein Synonym für Hash#each.
Diese Methode iteriert über alle Schlüssel genauso wie Arrah#each.
>> freund.each_key do |key| ?> puts key >> end bundesland nachname adresse vorname stadt land |
Iteriert über alle Werte.
>> friend.each_value do |val| ?> puts val >> end Neunkirchen Maier Deutschland Saarland Auf Maien 69 Herbert |
Iteratoren |
|
Übung: Adressbuch |