2016-05-14 3 views
2

Я просто наткнулся на следующее поведение. Для того, чтобы воспроизвести его, создать класс с инст вар:Странное поведение в массивах 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 разы)

+0

Смотрите оба ответ Тобиаса и blabla999 находится в связанном вопросе –

ответ

3

Это происходит потому, литеральный массив #(0) хранится внутри объекта метода.

Разъяснение здесь: Why shouldn't I store into literal arrays in Smalltalk?

+0

Да, на самом деле ловушка языка. –

+1

Упрощенный ответ Тобиаса на странице он ref, я рекомендую всем прочитать его полностью. –

+1

@ BerndElkemann это не ловушка языка, это следствие наличия системы, состоящей из объектов. Поведение становится естественным, когда наше мышление ОО преодолевает наши текстовые рассуждения. –