Programmierung in Ruby

Der Leitfaden der Pragmatischen Programmierer

class Struct
Parent: Object
Version: 1.6

Index:

new new members == [ ] [ ]= each length members size to_a values



Subclasses: Struct::Tms

Ein Struct ist ein bequemer Weg, um eine Menge von Attributen zu bündeln und Zugriffsmethoden zu verwenden ohne eine eigene Klasse schreiben zu müssen.

Die Struct-Klasse generiert spezifische Klassen, die jeweils definiert werden, um einen Satz von Variablen und ihren Zugriffsmethoden zu halten. In den folgenden Beispielen nennen wir die generierte Klasse ``CustomerClass'' und wir schreiben für eine Beispielinstanz dieser Klasse ``CustomerInst.''

In den nachfolgenden Beispielen benennt der Parameter einSymbol ein Symbol, das entweder ein String in Anführungszeichen oder ein Symbol-Objekt (z.B. :name) ist.
mixins
Enumerable: collect, detect, each_with_index, entries, find, find_all, grep, include?, map, max, member?, min, reject, select, sort, to_a

class methods
new Struct.new( [einString][, einSymbol]+ ) -> CustomerClass

Erstellt eine neue Klasse, die einString heisst und Zugriffsmethoden für die angegebenen Symbole enthält. Wenn des Name einString weggelassen wird, wird eine anonyme Klasse erstellt. Sonst erscheint der Name als Klassenkonstante in Struct, so dass er für alle Structs im System gleich ist. Der Name sollte mit einem Großbuchstaben beginnen.

Struct.new gibt ein neues Class-Objekt zurück, das dann verwendet werden kann, um spezifische Instanzen der neuen Struktur zu generieren. Die übrigen, unten aufgeführten Klassen- und Instanzmethoden werden für die generierte Klasse definiert. Siehe die nachfolgende Beschreibung für ein Beispiel. The remaining methods listed below (class and instance) are defined for this generated class. See the description that follows for an example.

new CustomerClass.new( [einObjekt]+ ) -> CustomerInst

Erstellt eine neue Instanz. Die Anzahl der Parameter muss kleiner oder gleich der Anzahl der Attribute dieser Klasse sein; nicht vorgegebene Parameter enthalten standard-mäßig nil. Werden zu viele Argument übergeben, so wird ein ArgumentError geworfen.

Customer = Struct.new( "Customer", :name, :address, :zip )
joe = Customer.new( "Joe Smith", "123 Maple, Anytown NC", 12345 )
joe.name » "Joe Smith"
joe.zip » 12345

members CustomerClass.members -> einArray

Gibt ein Array von Strings mit den Namen der Instanzvariablen zurück.

Customer = Struct.new( "Customer", :name, :address, :zip )
Customer.members » ["name", "address", "zip"]

instance methods
== CustomerInst == eineAndereStruct-> true oder false

Gleichheit---Gibt true zurück, wenn eineAndereStruct diesem Struct gleicht: Sie müssen dieselbe von Struct.new generierte Klasse haben und die Werte aller Instanzvariablen müssen unter Object#==) gleich sein.

Customer = Struct.new( "Customer", :name, :address, :zip )
joe   = Customer.new( "Joe Smith", "123 Maple, Anytown NC", 12345 )
joejr = Customer.new( "Joe Smith", "123 Maple, Anytown NC", 12345 )
jane  = Customer.new( "Jane Doe", "456 Elm, Anytown NC", 12345 )
joe == joejr » true
joe == jane » false

[ ] CustomerInst[ einSymbol ] -> einObjekt
CustomerInst[ einInteger ] -> einObjekt

Attributreferenz---Gibt den Wert der Instanzvariablen, die durch einSymbol benannt bzw. durch einInteger indiziert (0..laenge-1) wird, zurück. Die Methode wirft einen NameError wenn die benannte Variable nicht existiert bzw. einen IndexError wenn der Index ausserhalb der zulässigen Grenzen liegt.

Customer = Struct.new( "Customer", :name, :address, :zip )
joe = Customer.new( "Joe Smith", "123 Maple, Anytown NC", 12345 )
joe["name"] » "Joe Smith"
joe[:name] » "Joe Smith"
joe[0] » "Joe Smith"

[ ]= CustomerInst[ einSymbol ] = einObjekt-> einObjekt
CustomerInst[ einInteger ] = einObjekt-> einObjekt

Attributzuweisung---Weist der Instanzvariablen, die durch einSymbol benannt bzw. durch einInteger indiziert wird den Wert einObjekt zu und gibt diesen zurück. Die Methode wirft einen NameError wenn die benannte Variable nicht existiert bzw. einen IndexError wenn der Index ausserhalb der definierten Grenzen liegt.

Customer = Struct.new( "Customer", :name, :address, :zip )
joe = Customer.new( "Joe Smith", "123 Maple, Anytown NC", 12345 )
joe["name"] = "Luke"
joe[:zip]   = "90210"
joe.name » "Luke"
joe.zip » "90210"

each CustomerInst.each {| einObjekt | block }

-> CustomerInst

Ruft block je Instanzvariable einmal auf und übergibt deren Wert an den Codeblock.

Customer = Struct.new( "Customer", :name, :address, :zip )
joe = Customer.new( "Joe Smith", "123 Maple, Anytown NC", 12345 )
joe.each {|x| puts(x) }
produces:
Joe Smith
123 Maple, Anytown NC
12345

length CustomerInst.length -> einInteger

Gibt die Anzalh der Instanzvariablen zurück.

Customer = Struct.new( "Customer", :name, :address, :zip )
joe = Customer.new( "Joe Smith", "123 Maple, Anytown NC", 12345 )
joe.length » 3

members CustomerInst.members -> einArray

Gibt ein Array von Strings mit den Namen der Instanzvariablen zurück.

Customer = Struct.new( "Customer", :name, :address, :zip )
joe = Customer.new( "Joe Smith", "123 Maple, Anytown NC", 12345 )
joe.members » ["name", "address", "zip"]

size CustomerInst.size -> einInteger

Synonym für Struct#length.

to_a CustomerInst.to_a -> einArray

Gibt die Werte dieser Instanz als Array zurück.

Customer = Struct.new( "Customer", :name, :address, :zip )
joe = Customer.new( "Joe Smith", "123 Maple, Anytown NC", 12345 )
joe.to_a[1] » "123 Maple, Anytown NC"

values CustomerInst.values -> einArray

Synonym für to_a.


Extracted from the book "Programming Ruby - The Pragmatic Programmer's Guide"
Übersetzung: Carsten Schinzer
Für das englische Original:
© 2000 Addison Wesley Longman, Inc. Released under the terms of the Open Publication License V1.0. That reference is available for download.
Diese Lizenz sowie das Original vom Herbst 2001 bilden die Grundlage der Übersetzung
Es wird darauf hingewiesen, dass sich die Lizenz des englischen Originals inzwischen geändert hat.
Für die deutsche Übersetzung:
© 2002 Jürgen Katins
Der Copyright-Eigner stellt folgende Lizenzen zur Verfügung:
Nicht-freie Lizenz:
This material may be distributed only subject to the terms and conditions set forth in the Open Publication License, v1.0 or later (the latest version is presently available at http://www.opencontent.org/openpub/). Distribution of substantively modified versions of this document is prohibited without the explicit permission of the copyright holder. Distribution of the work or derivative of the work in any standard (paper) book form is prohibited unless prior permission is obtained from the copyright holder.
Freie Lizenz:
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front-Cover Texts, and with no Back-Cover Texts. A copy of the license is included in the section entitled "GNU Free Documentation License".