4 Stimmen

Typisierte Sammlungen in Smalltalk

Ich versuche, etwas Smalltalk-Programmierung zu lernen.... Ich versuche, eine Liste von Objekten des Typs myClass zu erstellen. Was ist der beste Weg, dies zu tun?

Ich habe die folgenden:

| list |
list := OrderedCollection new.

Korrigieren Sie mich, wenn ich falsch liege.

Wie sollte ich also Elemente zu meiner Liste hinzufügen?

12voto

Damien Cassou Punkte 2513

Um neue Instanzen von MyClass zu erstellen, senden Sie der Klasse die Nachricht #new

MyClass new

Um nun ein Element zu einer Sammlung hinzuzufügen, senden Sie der Sammlung einfach die Nachricht #add:

list add: MyClass new

So etwas wie statische Typen gibt es in Smalltalk nicht. Mit anderen Worten, das Äquivalent zu Java ArrayList<MyClass> ist einfach OrderedCollection.

3voto

Euan M Punkte 1078

Vor der Beantwortung der Frage Es ist wichtig zu betonen, dass es in Smalltalk keine starke Typisierung gibt. Jede Variable ist eine Instanz einer Klasse von Objekten. Aber die Klasse des Objekts kann sich während des Lebenszyklus des Objekts häufig ändern und weder der Interpreter noch der Compiler kümmern sich darum.

Geben Sie den folgenden Code in den Arbeitsbereich ein (oder in den "Playground" auf Pharo 4.0 und höher, oder in die Kommandozeile von GNU Smalltalk)

aNumber := 3 . "new instance of Class SmallInt is created"
aNumber := 22/7 . "aNumber is now an instance of Class Fraction"   
aNumber := 3.14159 . "aNumber is now an instance of Class Float"  
aNumber := 'Pi' . "aNumber is now an instance of Class ByteString"

Für diese Anweisungen werden keine Warnungen oder Ausnahmen ausgelöst.

Das ist jetzt aus dem Weg geräumt,

Wie sollte ich meiner Liste Elemente hinzufügen?

Dies hängt von der Art der Liste ab, die Sie verwenden.

Ein Array ist eine ganzzahlig indizierte Liste mit fester Größe. Eine OrderedCollection ist eine ganzzahlig indizierte Liste mit variabler Größe. Ein Set ist eine Sammlung von eindeutigen Objekten. Ein Dictionary ist eine Menge von Assoziationsobjekten, d. h. von Schlüssel-Wert-Paaren. Eine SortedCollection ist eine Liste von Objekten, sortiert auf der Grundlage einer Sortierblock Definition.

Sie haben jeweils eigene Methoden zum Hinzufügen von Artikeln.

Die gängigsten Methoden für die Standardsammlungen sind -
add: (nicht verfügbar für Array oder String - da die Anzahl der Elemente nach der ersten Erstellung nicht geändert werden kann) at:put: (nicht verfügbar für Set, da es nur Schlüssel, aber keine Werte enthält)

OrderedCollection hat auch addFirst: , add:after: , add:before: , add:beforeIndex:

Wenn Sie eine Hinzufügungsnachricht an eine Sammlung senden, die Sammlung diese Nachricht aber nicht versteht, löst sie eine Ausnahme aus.

Also, für Ihre list

| list newElement1 newElement2 newElement3 |
list := OrderedCollection new .
newElement1 := 'ABC' . "a ByteString"
newElement2 := 123 . "a SmallInt"
newElement3 := Dictionary new .
newElement3 at: 'Doh' put: 'A deer, a female deer' ;
            at: 'Ray' put: 'A drop of golden sun' ;
            at: 'So' put: 'A needle pulling thread' .
list add: newElement1 ;
     add: newElement2 ;
     add: newElement3 .

würde dazu führen, dass
list (an OrderedCollection) [3 items] ('ABC' 123 aDictionary [2 items] ( 'Doh'->'A deer, a female deer' 'Ray'->'A drop of golden sun'))

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X