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)
存储在方法对象中。
此处解释:
我只是无意中发现了以下行为。要重现它,请使用 inst var:
创建一个 classObject 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)
存储在方法对象中。
此处解释: