Я просто наткнулся на следующее поведение. Для того, чтобы воспроизвести его, создать класс с инст вар:Странное поведение в массивах Squeak Smalltalk
Object subclass: #Asdf
instanceVariableNames: 'countSeq'
classVariableNames: ''
poolDictionaries: ''
category: 'Asdf'
И ленивый-INIT поглотитель:
countSeq
^countSeq ifNil: [
countSeq:=#(0) asOrderedCollection.
countSeq at: 1 put: (countSeq at: 1)+1.
countSeq
].
Это работает правильно. Когда я звоню Asdf new countSeq
, он возвращает an OrderedCollection(1)
каждый раз.
Однако, если я удалить asOrderedCollection
:
countSeq
^countSeq ifNil: [
countSeq:=#(0).
countSeq at: 1 put: (countSeq at: 1)+1.
countSeq
].
И называют Asdf new countSeq
несколько раз, то я получаю #(1)
, #(2)
, #(3)
.... Как это можно объяснить?
(Он смотрит на меня, вроде как, если этот массив ведет себя как статические локальные переменный C На самом деле, я попытался это:. Перекомпилировать метод и несчастная счетчик начинается с 1 разы)
Смотрите оба ответ Тобиаса и blabla999 находится в связанном вопросе –