Changes between Version 23 and Version 24 of squeak_faq


Ignore:
Timestamp:
10/25/2013 12:02:13 AM (11 years ago)
Author:
jakob.reschke
Comment:

Arrays {} vs. #() hinzugefügt

Legend:

Unmodified
Added
Removed
Modified
  • squeak_faq

    v23 v24  
    639639        nextPutAll: 'abc'].
    640640}}}
     641
     642=== Was ist der Unterschied zwischen {} und #() bei Arrays und welches sollten wir verwenden? ===
     643
     644Die Variante mit #() beschreibt ein Array-Literal, d. h. was innerhalb der Klammern steht, muss beim Compilieren des Smalltalk-Codes bereits feststehen. Man kann damit also Arrays anlegen, die weitere Literale enthalten, z. B. Characters, Strings, Integers oder Floats, sowie die Konstanten `true`, `false` und `nil`. Andere Wörter werden als Symbole interpretiert. `#(eins zwei drei)` erzeugt also ein Array, welches die Symbole `#eins`, `#zwei` und `#drei` enthält. Man kann mit Array-Literalen jedoch nicht das Ergebnis einer Nachricht in das Array aufnehmen, da dieses zur Kompilierzeit noch nicht feststeht!
     645
     646Im Unterschied zu den Array-Literalen werden die zwischen {} aufgezählten Ausdrücke zur Ausführungszeit des Codes ausgewertet und deren Ergebnis im Array gespeichert. Weiterhin müssen die Elemente des Arrays durch einen Punkt getrennt werden (der Punkt am Ende kann genau wie am Ende einer Methode entfallen), was bei Array-Literalen nicht vorgesehen ist. Das Array `{1. #zwei. 'dr', 'ei'. -4 negated}` würde also folgende vier Elemente enthalten: den Integer 1, das Symbol `#zwei`, den String `'drei'` und den Integer 4.
     647
     648Ein weiteres Beispiel: `{self}` ergibt ein Array, welches das Objekt enthält, das die aktuelle Methode ausführt, während `#(self)` ein Array ergibt, welches das Symbol `#self` enthält.
     649
     650Die geschweiften Klammern sind nicht offizieller Teil von Smalltalk, sondern wurden mit Squeak als Erweiterung der Sprache eingeführt. Das ist jedoch kein Grund, sie nicht in den Projekten zu verwenden. Müsste man Smalltalk Code schreiben, der zu VMs anderer Hersteller kompatibel sein soll, müsste man jedoch darauf achten. Die Alternativen in Standard-Smalltalk wären z. B. die Array-Konstruktoren `Array with: firstElement`, `Array with: firstElement with: secondElement`, usw., `Array withAll: aCollection`, sowie das Anlegen eines Arrays mit `Array new: sizeNumber` und anschließendes manuelles Befüllen mit `at:put:`.
     651
     652Dadurch, dass Array-Literale schon zur Kompilierzeit feststehen, ist das Erzeugen von Arrays damit billiger als mit {}. Falls die Werte im Array jedoch nicht konstant sind, sondern sich erst zur Laufzeit ergeben, oder wenn ihr das Array später verändern wollt (dazu gehören auch Nachrichten wie z. B. `sort:`, die eine Collection in-place verändern), nutzt bitte die Schreibweise mit geschweiften Klammern. Andernfalls würdet ihr das in die Methode einkompilierte Array verändern, was zu Problemen führen kann...