6

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

x := something

它工作正常。

但是在类中,如果我定义了一个新方法,但我没有声明变量,我会得到一个“赋值给未声明的变量 x”,所以我必须使用:

|x| x := something

为什么是这样?

4

2 回答 2

11

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


实例变量


含义:这些是定义类形状的那些。例如,该类Point定义了 ivarsxy.

声明:在类定义中。

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

大小写:通常是小写。


类变量


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

声明:在类定义中。

范围:由类、它的元类、所有子类、它们的元类、所有实例和所有子实例共享。

大小写:通常是大写。


类实例变量


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

声明:在类定义中。

范围:本地,仅限于类端方法。

大小写:通常是小写。


临时工


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

声明:| temp |在方法(或块)主体开始处的管道之间。

范围:方法或块的激活。

大小写:通常是小写。


池变量


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

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

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

大小写:通常是大写。


全局变量


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

宣布:无处。它们在 Smalltalk 系统词典中由 meas of 定义Smalltalk at: <GlobalSymbol> put: <an object>。一旦声明了它们的值,就可以使用:=.

范围:整个图像。

大小写:通常是大写。

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


伪变量


含义:它们可以读但不能写。它们是:selfsupertruefalsenil

宣布:无处。

适用范围:可以在任何地方使用。但是,使用它们的对象的含义self和变化。supper


方法和块参数


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

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

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

大小写:小写。


工作区变量


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

已声明:通常不显式声明(工作区将在幕后声明它们)。

范围:工作空间的生命周期。

大小写:小写。

于 2017-02-25T19:23:06.727 回答
7

x := something出于脚本原因允许。事实上,它x为您的脚本创建了一个变量。现在,如果您x在没有显式声明的情况下编写方法,应该创建哪种变量?一个临时变量,或者一个实例变量,或者一个类变量,或者一个池变量,或者可能是一个全局绑定?为避免此类问题,您必须在某处声明一个变量,然后使用它。

不同的其他语言还使用另一种策略,例如在变量@@必须是类变量时为其添加前缀。但这会引入丑陋的语法,限制你的命名自由等等……</p>

于 2017-02-25T18:16:10.343 回答