Container

Arrays

Arrays beinhalten eine Liste von Objektreferenzen, auf die indiziert zugegriffen werden kann. In Ruby gibt es einige sinnvolle und flexible Indizierungsmethoden, die im folgenden an Hand von Beispielen verdeutlicht werden sollen

Array-Definition:

>> a = ["HSV", 1, 1.456, nil, "Action Jackson"]
=> ["HSV", 1, 1.456, nil, "Action Jackson"]

"Normale" Indizierung:

>> a[1]
=> 1

Negative Indizes (vom letzten zum ersten Element):

>> a[-1]
=> "Action Jackson"
>> a[-2]
=> nil

Bereichs-Indizierung (hier: von Element mit Index 2 bis Element mit Index 3):

>> a[2..3]
=> [1.456, nil]

Änderung von Werten:

>> a[3] = [1,3,"Ruby"]
=> [1, 3, "Ruby"]

Bereichs-Indizierung (hier: 3 Elemente, beginnend mit Element mit Index 2)

>> a[2,3]
=> [1.456, [1, 3, "Ruby"], "Action Jackson"]

Das komplette Array-Objekt, das String-, Integer-, Float- und Array-Objekte enthält:

>> a
=> ["HSV", 1, 1.456, [1, 3, "Ruby"], "Action Jackson"]

Zusätzlich zu den den bisher vorgestellten Indizierungs-möglichkeiten bietet die Array-Klasse noch viele weitere Methoden an, die das implementieren eigener Container in vielen Fällen unnötig werden lässt:

>> [2,3,1].sort
=> [1, 2, 3]
>> [2,3,1].sort.reverse
=> [3, 2, 1]
>> a = [2,[3,1]]
=> [2, [3, 1]]
>> a.flatten
=> [2, 3, 1]
>> a
=> [2, [3, 1]]
>> a.flatten!
=> [2, 3, 1]
>> a
=> [2, 3, 1]
>> [1,2,3,4,5].select{|x| x > 3}
=> [4, 5]
>> [].methods
=> ["instance_eval", "replace", "collect", "sort!", "[]=", "to_a", "assoc", "to_ary", "reverse", "all?", "<<", "&", "type", "entries", "protected_methods", "extend", "push", "eql?", "*", "detect", "instance_variable_set", "zip", "+", "is_a?", "hash", "reverse_each", "to_s", "rassoc", "-", "empty?", "map", "collect!", "compact!", "at", "any?", "sort", "class", "min", "display", "tainted?", "reject!", "private_methods", "flatten", "pop", "untaint", "|", "find_all", "transpose", "each", "id", "insert", "reverse!", "indexes", "inject", "map!", "inspect", "uniq", "delete", "fetch", "concat", "clone", "sort_by", "values_at", "public_methods", "max", "shift", "freeze", "respond_to?", "select", "clear", "join", "index", "slice", "__id__", "indices", "length", "methods", "partition", "<=>", "==", "flatten!", "first", "===", "delete_at", "grep", "nil?", "dup", "instance_variables", "nitems", "include?", "instance_of?", "unshift", "send", "rindex", "reject", "fill", "uniq!", "object_id", "size", "=~", "singleton_methods", "compact", "__send__", "last", "member?", "equal?", "taint", "find", "delete_if", "method", "instance_variable_get", "each_with_index", "frozen?", "kind_of?", "pack", "each_index", "[]", "slice!"]

Hashes

Hashes sind ebenfalls Listen, in denen mit Hilfe von Indizes auf Elemente der Liste zugegriffen werden kann. Allerdings können die Indizes in diesem Fall beliebige Objekte sein, sie müssen sich nur alle von einander unterscheiden. Hier ein paar Spielereien mit Hashes:

>> h = { "HSV" => "Doll", 1 => 1.345, "Doll" => 27, 2 => 45}
=> {"HSV"=>"Doll", 1=>1.345, "Doll"=>27, 2=>45}
>> h.length
=> 4
>> h["Doll"]
=> 27
>> h["HSV"]
=> "Doll"
>> h[h["HSV"]]
=> 27
>> h["Neuschwanstein"]="Franz Beckenbauer"
=> "Franz Beckenbauer"
>> h
=> {"HSV"=>"Doll", 1=>1.345, "Doll"=>27, 2=>45, "Neuschwanstein"=>"Franz Beckenbauer"}

Iteratoren

Für die Klassen Array und Hash steht das Iterator-Strukturmuster bereits in Form der Methode each zur Verfügung. Diese Methode muss immer mit einem Codeblock aufgerufen werden, wordurch das Visitor-Strukturmuster realisiert wird. Der Block muss jeweils mit einer Variable in "|"-Zeichen ( z.B. |i|), über die iteriert wird, beginnen. Darauf folgen dann die auszuführenden Anweisungen:

>> profs=%w[ Häuslein Raubach Schmidt Gerhardt ] # %w erzeugt ein Array mit Strings
=> ["Häuslein", "Raubach", "Schmidt", "Gerhardt"]
>> profs.sort.each {|prof| puts prof}
Gerhardt
Häuslein
Raubach
Schmidt
=> ["Häuslein", "Raubach", "Schmidt", "Gerhardt"]