Странное поведение в Squeak Smalltalk массивах
Я просто наткнулся на следующее поведение. Чтобы воспроизвести его, создайте класс с inst var:
Object subclass: #Asdf
instanceVariableNames: 'countSeq'
classVariableNames: ''
poolDictionaries: ''
category: 'Asdf'
И ленивый инициатор:
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)
... Как это можно объяснить?
(Мне кажется, что этот массив ведет себя как статическая локальная переменная Си. На самом деле, я попробовал это: перекомпилировать метод, и неудачный счетчик снова начинается с 1)
1 ответ
Решение
Это потому, что буквенный массив #(0)
хранится внутри объекта метода.
Объясняется здесь: почему я не должен хранить в буквальных массивах в Smalltalk?