基本上我可以通过为它们分配一些东西来使用变量,例如:
x := something
它工作正常。
但是在类中,如果我定义了一个新方法,但我没有声明变量,我会得到一个“赋值给未声明的变量 x”,所以我必须使用:
|x| x := something
为什么是这样?
基本上我可以通过为它们分配一些东西来使用变量,例如:
x := something
它工作正常。
但是在类中,如果我定义了一个新方法,但我没有声明变量,我会得到一个“赋值给未声明的变量 x”,所以我必须使用:
|x| x := something
为什么是这样?
正如 Uko 提到的,Smalltalk 中有不同种类的变量,这就是为什么我们需要以不同方式声明它们的原因。为了完整起见,让我们在这里查看所有 Smalltalk 变量。
实例变量
含义:这些是定义类形状的那些。例如,该类Point
定义了 ivarsx
和y
.
声明:在类定义中。
范围:本地,仅限于每个实例。
大小写:通常是小写。
类变量
含义:这些变量在多个对象之间共享。它们不是全球性的。
声明:在类定义中。
范围:由类、它的元类、所有子类、它们的元类、所有实例和所有子实例共享。
大小写:通常是大写。
类实例变量
含义:是元类的实例变量,因此决定了类的形状(而不是它的实例)。
声明:在类定义中。
范围:本地,仅限于类端方法。
大小写:通常是小写。
临时工
含义:这些是方法和块中使用的辅助变量。每次激活方法时,它们都会在执行堆栈中分配(除了在方法或块闭包中声明并在内部块中使用的那些)。
声明:| temp |
在方法(或块)主体开始处的管道之间。
范围:方法或块的激活。
大小写:通常是小写。
池变量
含义:保存在全局中PoolDictionaries
,可以在任何声明其用途的类中使用。
已声明:该类声明了PoolDictionary
定义它们的 的用法。
范围:类以及所有子类和元类。
大小写:通常是大写。
全局变量
含义:由系统中的每个对象共享。
宣布:无处。它们在 Smalltalk 系统词典中由 meas of 定义Smalltalk at: <GlobalSymbol> put: <an object>
。一旦声明了它们的值,就可以使用:=
.
范围:整个图像。
大小写:通常是大写。
备注:类名是全局变量。但是,您不应该使用:=
(除非您知道自己在做什么。)
伪变量
含义:它们可以读但不能写。它们是:self
、super
、true
和false
。nil
宣布:无处。
适用范围:可以在任何地方使用。但是,使用它们的对象的含义self
和变化。supper
方法和块参数
含义:它们代表方法或块在每次激活时将接受(和要求)的形式参数。
声明:在方法签名或块的开头。
范围:声明它们的方法或块。
大小写:小写。
工作区变量
含义:这些是与工作区相关的变量(Pharo 中的 Playground)。
已声明:通常不显式声明(工作区将在幕后声明它们)。
范围:工作空间的生命周期。
大小写:小写。
x := something
出于脚本原因允许。事实上,它x
为您的脚本创建了一个变量。现在,如果您x
在没有显式声明的情况下编写方法,应该创建哪种变量?一个临时变量,或者一个实例变量,或者一个类变量,或者一个池变量,或者可能是一个全局绑定?为避免此类问题,您必须在某处声明一个变量,然后使用它。
不同的其他语言还使用另一种策略,例如在变量@@
必须是类变量时为其添加前缀。但这会引入丑陋的语法,限制你的命名自由等等……</p>