Smalltalk变量:我为什么要声明它们?

时间:2017-02-25 17:58:01

标签: smalltalk gnu-smalltalk

基本上我只能通过为它们分配一些东西来使用变量,例如:

x := something

工作正常。

但是在课堂上,如果我定义一个新方法,但我没有声明变量,我得到了一个"赋予未声明的变量x",所以我必须使用:

|x| x := something

为什么会这样?

2 个答案:

答案 0 :(得分:6)

正如Uko所提到的,Smalltalk中存在不同类型的变量,这就是我们需要以不同方式声明它们的原因。为了完整起见,我们在这里查看所有Smalltalk变量。

1。实例变量

含义:这些是定义类形状的。例如,课程Point定义了ivars xy

声明:在类定义中。

范围:本地,仅限于每个实例。

案例:通常是小写的。

2。类变量

含义:这些变量在多个对象之间共享。但它们不是全球性的。

声明:在类定义中。

范围:由类,其元类,所有子类,其元类,所有实例和所有子实例共享。

案例:通常为大写。

3。 类实例变量

含义:是元类的实例变量,因此决定了类的形状(而不是它的实例)。

声明:在类定义中。

范围:本地,仅限于班级方法。

案例:通常是小写的。

4。的临时变量

含义:这些是方法和块中使用的辅助变量。每次激活方法时,它们都会在执行堆栈中分配(期望在方法或块闭包中声明并在内部块中使用)。

声明:在方法(或块)正文开头的| temp |中的管道之间。

范围:激活方法或块。

案例:通常是小写的。

5。 池变量

含义:保存在全局PoolDictionaries中,可以在任何声明其使用的类中使用。

声明:该类声明了定义它们的PoolDictionary的用法。

范围:该类以及所有子类和元类。

案例:通常为大写。

6。 全局变量

含义:由系统中的每个对象共享。

声明:无处。它们在Smalltalk系统字典中通过meas Smalltalk at: <GlobalSymbol> put: <an object>定义。声明后,可以使用:=更改其值。

范围:整个图像。

案例:通常为大写。

备注:类名是全局变量。但是,您不应该使用:=分配它们(除非您知道自己在做什么。)

7。 伪变量

含义:可以通过不写入来读取它们。它们是:selfsupertruefalsenil

声明:无处。

范围:可以随处使用。但是,selfsupper的含义会随着使用它们的对象而改变。

8。方法和块参数

含义:它们代表方法或块在每次激活时都会接受(和要求)的形式参数。

声明:在方法签名或块的开头。

范围:声明它们的方法或块。

案例:小写。

9。工作区变量

含义:这些是与工作空间相关的变量(Pharo中的Playground)。

声明:通常没有显式声明(工作区会在幕后声明它们)。

范围:工作空间的生命。

案例:小写。

答案 1 :(得分:5)

出于脚本原因,允许

x := something。实际上,它为您的脚本创建了一个变量x。现在,如果在没有显式声明的方法中编写x,应该创建哪种变量?临时变量,实例变量,类变量,池变量,还是全局绑定?要避免此类问题,您必须在某处声明变量然后使用它。

不同的其他语言使用另一种策略,例如,如果变量必须是类变量,则为@@添加前缀。但是这会引入难看的语法,限制你的命名自由等等......