基本上我只能通过为它们分配一些东西来使用变量,例如:
x := something
工作正常。
但是在课堂上,如果我定义一个新方法,但我没有声明变量,我得到了一个"赋予未声明的变量x",所以我必须使用:
|x| x := something
为什么会这样?
答案 0 :(得分:6)
正如Uko所提到的,Smalltalk中存在不同类型的变量,这就是我们需要以不同方式声明它们的原因。为了完整起见,我们在这里查看所有Smalltalk变量。
含义:这些是定义类形状的。例如,课程Point
定义了ivars x
和y
。
声明:在类定义中。
范围:本地,仅限于每个实例。
案例:通常是小写的。
含义:这些变量在多个对象之间共享。但它们不是全球性的。
声明:在类定义中。
范围:由类,其元类,所有子类,其元类,所有实例和所有子实例共享。
案例:通常为大写。
含义:是元类的实例变量,因此决定了类的形状(而不是它的实例)。
声明:在类定义中。
范围:本地,仅限于班级方法。
案例:通常是小写的。
含义:这些是方法和块中使用的辅助变量。每次激活方法时,它们都会在执行堆栈中分配(期望在方法或块闭包中声明并在内部块中使用)。
声明:在方法(或块)正文开头的| temp |
中的管道之间。
范围:激活方法或块。
案例:通常是小写的。
含义:保存在全局PoolDictionaries
中,可以在任何声明其使用的类中使用。
声明:该类声明了定义它们的PoolDictionary
的用法。
范围:该类以及所有子类和元类。
案例:通常为大写。
含义:由系统中的每个对象共享。
声明:无处。它们在Smalltalk系统字典中通过meas Smalltalk at: <GlobalSymbol> put: <an object>
定义。声明后,可以使用:=
更改其值。
范围:整个图像。
案例:通常为大写。
备注:类名是全局变量。但是,您不应该使用:=
分配它们(除非您知道自己在做什么。)
含义:可以通过不写入来读取它们。它们是:self
,super
,true
,false
和nil
。
声明:无处。
范围:可以随处使用。但是,self
和supper
的含义会随着使用它们的对象而改变。
含义:它们代表方法或块在每次激活时都会接受(和要求)的形式参数。
声明:在方法签名或块的开头。
范围:声明它们的方法或块。
案例:小写。
含义:这些是与工作空间相关的变量(Pharo中的Playground)。
声明:通常没有显式声明(工作区会在幕后声明它们)。
范围:工作空间的生命。
案例:小写。
答案 1 :(得分:5)
x := something
。实际上,它为您的脚本创建了一个变量x
。现在,如果在没有显式声明的方法中编写x
,应该创建哪种变量?临时变量,实例变量,类变量,池变量,还是全局绑定?要避免此类问题,您必须在某处声明变量然后使用它。
不同的其他语言使用另一种策略,例如,如果变量必须是类变量,则为@@
添加前缀。但是这会引入难看的语法,限制你的命名自由等等......