为什么分配许多变量似乎会改变我的变量?
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.
].
我是 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.
].