Smalltalk-Array-Typen

8

Beim Betrachten von Smalltalk-Syntaxdefinitionen sind mir einige verschiedene Notationen für Arrays aufgefallen:

%Vor%
  • Warum gibt es verschiedene Array-Typen? In anderen Programmiersprachen weiß ich, dass es nur eine Art Array gibt, die unabhängig vom gespeicherten Typ ist.
  • Wann wählen Sie welche Art?
  • Warum haben literales Array und Array eine andere Notation als dieselbe Klasse?
phineas 27.01.2013, 12:44
quelle

2 Antworten

11

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.

    
Michael 27.01.2013, 13:00
quelle
16

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:

%Vor%

Andererseits ist {} lediglich ein syntaktischer Zucker für die Erstellung von Arrays, daher ist { 1+2. #a. anObject} äquivalent zu:

%Vor%     
Martin Kobetic 27.01.2013 16:47
quelle

Tags und Links