Beim Betrachten von Smalltalk-Syntaxdefinitionen sind mir einige verschiedene Notationen für Arrays aufgefallen:
%Vor%Hier ist ein kleiner Überblick:
Zunächst können wir herausfinden, welche Typen resp. Klassen der resultierenden Objekte:
#[] class
Ergebnisse in ByteArray
#() class
Ergebnisse in Array
{} class
ergibt auch Array
Offenbar erzeugen die beiden letzteren Arrays, während die erste ein ByteArray erzeugt. ByteArrays sind das, was Sie erwarten würden - Bytes mit fester Größe.
Jetzt müssen wir den Unterschied zwischen #()
und {}
herausfinden. Versuchen Sie, #(a b c)
zu bewerten, es ergibt sich #(#a #b #c)
; Wenn Sie jedoch versuchen, {a b c}
auszuwerten, funktioniert es nicht (weil a
nicht definiert ist). Die Arbeitsversion wäre {#a. #b. #c}
, was auch in #(#a #b #c)
resultiert.
Der Unterschied zwischen #()
und {}
besteht darin, dass die erste eine Liste von Symbolnamen enthält, die durch Leerzeichen getrennt sind. Sie dürfen auch die #
-Zeichen weglassen. Mit dieser Notation können Sie nur Arrays erstellen, die Symbole enthalten. Die zweite Version ist das generische Array-Literal. Es braucht alle Ausdrücke, getrennt durch .
(Punkte). Sie können sogar Dinge wie {1+2. anyObject complexOperation}
schreiben.
Dies könnte dazu führen, dass Sie immer die {}
-Notation verwenden. Beachten Sie jedoch Folgendes: Der Zeitpunkt der Objekterstellung ist unterschiedlich: Während #()
Arrays beim Kompilieren erstellt werden, werden {}
Arrays während der Ausführung erstellt. Wenn Sie also Code mit einem #()
-Ausdruck ausführen, wird auch das selbe -Array zurückgegeben, während {}
nur gleiche -Arrays zurückgibt (solange Sie gleich verwenden) Inhalt). Außerdem ist AFAIK das {}
nicht unbedingt tragbar, weil es nicht Teil des ST-80 Standards ist.
Es gibt ein bisschen terminologische Verwirrung in Michaels Antwort, #()
ist ein literales Array, während {}
nicht ist. Ein literales Array ist das vom Compiler erstellte Array und kann einen beliebigen anderen Literalwert (einschließlich anderer Literal-Arrays) enthalten, sodass das folgende Array ein gültiges Literal-Array ist:
Andererseits ist {} lediglich ein syntaktischer Zucker für die Erstellung von Arrays, daher ist { 1+2. #a. anObject}
äquivalent zu: