【问题标题】:Why is assigning many variables seem to mutate my variable?为什么分配许多变量似乎会改变我的变量?
【发布时间】:2022-01-14 17:29:53
【问题描述】:

我是 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 版。

【问题讨论】:

  • unrelated 变量是如何定义的?我的意思是,它们是 ivars、temporaries、shared 吗?
  • 正如我所说,我对 Smalltalk 还很陌生,所以我不清楚这意味着什么。在这两种情况下,我的代码都是我直接使用 gst 运行的完整脚本:gst myfile.st。所以除了我贴的,没有多余的代码了。
  • 我不是 GNU Smalltalk 用户,但你没有做错任何事。脚本中的最大临时数(自动定义?)一定有问题。

标签: smalltalk gnu-smalltalk


【解决方案1】:

我相信这是 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.
].

【讨论】:

  • 这是有道理的,看到这样的错误有点令人困惑,但如果我依赖于不良做法和未定义的行为,这也是有道理的。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-11
  • 2015-01-07
  • 1970-01-01
  • 2017-11-20
  • 1970-01-01
相关资源
最近更新 更多