Squeak Smalltalk 阵列中的奇怪行为

Strange behavior in Squeak Smalltalk arrays

我只是无意中发现了以下行为。要重现它,请使用 inst var:

创建一个 class
Object subclass: #Asdf
  instanceVariableNames: 'countSeq'
  classVariableNames: ''
  poolDictionaries: ''
  category: 'Asdf'

还有一个惰性初始化 getter:

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

这工作正常。当我调用 Asdf new countSeq 时,它每次都会调用 returns 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) 存储在方法对象中。

此处解释: