2016-05-14 13 views
2

Ich bin gerade über das folgende Verhalten gestolpert. Zu reproduzieren, erstellen Sie eine Klasse mit einem inst var:Seltsames Verhalten in Squeak Smalltalk Arrays

Object subclass: #Asdf 
    instanceVariableNames: 'countSeq' 
    classVariableNames: '' 
    poolDictionaries: '' 
    category: 'Asdf' 

und eine Lazy-init Getter:

countSeq 
^countSeq ifNil: [ 
    countSeq:=#(0) asOrderedCollection. 
    countSeq at: 1 put: (countSeq at: 1)+1. 
    countSeq 
]. 

Dies korrekt funktioniert. Wenn ich Asdf new countSeq rufe, dann gibt es jedes Mal an OrderedCollection(1) zurück.

Allerdings, wenn ich die entfernen asOrderedCollection:

countSeq 
^countSeq ifNil: [ 
    countSeq:=#(0). 
    countSeq at: 1 put: (countSeq at: 1)+1. 
    countSeq 
]. 

Und rufen Asdf new countSeq mehrere Male, dann bekomme ich #(1), #(2), #(3) .... Wie kann das erklärt werden?

(Es scheint mir, wie, als ob dieses Array wie eine C statische lokale Variable verhält In der Tat, ich versuchte es. Das Verfahren und die unglückliche Zähler beginnt bei 1 wieder neu kompilieren)

+0

beide und Tobias Siehe blabla999 die Antworten in der verknüpften Frage –

Antwort

3

Dies, weil ist Das Literalarray #(0) ist im Methodenobjekt gespeichert.

hier Erklärt: Why shouldn't I store into literal arrays in Smalltalk?

+0

Ja, wirklich eine Falle der Sprache. –

+1

Uploated Tobias 'Antwort auf der Seite, die er ref, ich empfehle jedem, es vollständig zu lesen. –

+1

@BerndElkemann es ist keine Fallstricke der Sprache, es ist eine Konsequenz eines Systems aus Objekten. Das Verhalten wird natürlich, sobald unser OO-Denken unser textbasiertes Denken überwindet. –