示例:
st> [ fnord := 7 ] value
我总是觉得他们在Smalltalk
进入了SystemDictionary,但事实并非如此:
st> [ fnord := 7 ] value
st> Smalltalk at: #fnord
Object: SystemDictionary new: 512 "<0x2acfca382030>" error: Invalid argument #fnord: key not found
但是,至少在GNU Smalltalk上,值似乎是某个地方持久存在 ---访问fnord
会返回正确的值:
st> [ fnord := 7 ] value
st> fnord
7
更新:我想出了如何拆解块!这真的很难。
st> [ fnord := 7 ] block inspect
An instance of CompiledBlock
header: 32768
clean-ness flags: 0
number of arguments: 0
number of temporaries: 0
number of literals: 4
needed stack slots: 8
method: UndefinedObject>>executeStatements
literals: [
[1] {fnord}
[2] a BlockClosure
[3] #block
[4] #inspect
]
byte codes: [
[1] source code line number 1
[3] push 7
[5] store into Global Variable {fnord}
[7] pop stack top
push Global Variable {fnord}
[9] return stack top
]
[] in UndefinedObject>>executeStatements
所以它绝对认为它正在写一个全局变量。
答案 0 :(得分:2)
未声明的变量绑定进入名为key->value
的全局字典。一旦正确声明,该绑定(Smalltalk
对)将移至{{1}}。例如,这是在加载代码时解析前向引用的方式。也就是说,在声明加载的代码之前使用变量时。