smalltalk - Squeak Smalltalk 阵列中的奇怪行为

标签 smalltalk squeak

我刚刚偶然发现了以下行为。要重现它,请创建一个带有 inst var 的类:

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时然后它返回 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)存储在方法对象内。

此处解释:Why shouldn't I store into literal arrays in Smalltalk?

关于smalltalk - Squeak Smalltalk 阵列中的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37225760/

相关文章:

groovy - 非本地与本地返回 : Matter of implementation level?

scrollview - 如何使滚动 Pane 适应其内容?

logging - 有没有办法列出 Smalltalk session 中完成的所有 DoIt?

arrays - Pharo 3 中文字数组和动态数组的区别

smalltalk - 教科书上的 PetitParser 算术脚本不起作用。它一直说 ParseOn 为零?

http - 在 Squeak 中,一旦 block 到达,就将大 HTTP 响应的 block 写入磁盘

Smalltalk - 有没有类似于 C 中的 && 的东西?

selector - Smalltalk 委托(delegate)/存储消息选择器

smalltalk - 吱吱小声 : Why reduction of a fraction does not happen after numerator and denominator values are modified in the inspect window?

smalltalk - 如何以编程方式在smalltalk80(squeak)中创建箭头变形?