为什么分配许多变量似乎会改变我的变量?

Why is assigning many variables seem to mutate my variable?

我是 Smalltalk 的新手,所以我不知道我是否做错了什么,但这看起来很奇怪而且有错误。

dict := Dictionary new.
dict at: 1 put: 1.
dict at: 2 put: 2.
dict at: 3 put: 3.
dict at: 4 put: 4.


1 to: 4 do: [:j |

  key := j.

  value := dict at: key.
  value print.

  value printNl.
].

此代码工作正常并正确打印

11
22
33
44

但是,如果我向其他变量添加足够的赋值,脚本的结果将发生变化:

dict := Dictionary new.
dict at: 1 put: 1.
dict at: 2 put: 2.
dict at: 3 put: 3.
dict at: 4 put: 4.


1 to: 4 do: [:j |

  key := j.

  value := dict at: key.
  value print.


  unrelated := 1.
  unrelated2 := 1.
  unrelated3 := 1.
  unrelated4 := 1.
  unrelated5 := 1.
  unrelated6 := 1.
  unrelated7 := 1.
  unrelated8 := 1.
  unrelated9 := 1.
  unrelated10 := 1.

  value printNl.

].

此代码现在打印

11
21
31
41

如果我删除分配 unrelated10 的行,它会再次工作...我是否遗漏了什么或者 GNU Smalltalk 有问题?

我正在使用 GNU Smalltalk 版本 3.2.5。

我认为这是 GNU Smalltalk 中的错误。系统似乎允许您引用尚未定义的变量(此“功能”不是标准的)并且系统尝试定义变量及其范围存在问题。

解决方法是定义您自己的变量并尽可能缩小它们的范围(这在任何语言中都是很好的做法)。因此,请尝试以下操作(在 here 验证):

| dict |
dict := Dictionary new.
dict at: 1 put: 1.
dict at: 2 put: 2.
dict at: 3 put: 3.
dict at: 4 put: 4.


1 to: 4 do: [:j |
  "The following is a list of variables used in this code block"
  | key value 
    unrelated unrelated2 unrelated3 unrelated4 unrelated5
    unrelated6 unrelated7 unrelated8 unrelated9 unrelated10 |
     
  key := j.

  value := dict at: key.
  value print.

  unrelated := 1.
  unrelated2 := 1.
  unrelated3 := 1.
  unrelated4 := 1.
  unrelated5 := 1.
  unrelated6 := 1.
  unrelated7 := 1.
  unrelated8 := 1.
  unrelated9 := 1.
  unrelated10 := 1.

  value printNl.
].