Странное поведение в 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?

Другие вопросы по тегам