smalltalk中的变量类型

smalltalk中的变量类型,smalltalk,squeak,gnu-smalltalk,Smalltalk,Squeak,Gnu Smalltalk,我需要帮助理解Smalltalk中变量的用法和差异。 下面给出的代码中每个变量的区别和用法是什么 Object subclass: #MyClass instanceVariableNames: 'x' classVariableNames: 'Yy' poolDictionaries: '' category: 'helpMe' MyClass class instanceVariableNames: 'zzz' 实例变量(x)是实例的局部变量。该类或任何其他实例都不能

我需要帮助理解Smalltalk中变量的用法和差异。 下面给出的代码中每个变量的区别和用法是什么

Object subclass: #MyClass
  instanceVariableNames: 'x'
  classVariableNames: 'Yy'
  poolDictionaries: ''
  category: 'helpMe'

MyClass class
  instanceVariableNames: 'zzz'
实例变量(
x
)是实例的局部变量。该类或任何其他实例都不能访问该变量

类变量(
Yy
)是类、其所有实例、所有子类和所有子实例(因此是整个层次结构)的局部变量。任何子类或子实例都可以看到该变量的值

类实例变量(
zzz
)是类的本地变量。只有定义变量的类才能访问它,实例和子类都不能看到变量(尽管子类继承变量的声明,但它们的变量将具有不同的值)。 类也是Smalltalk中的对象。因此,您可以像对待实例变量一样看待类实例变量:没有其他实例(类的实例)可以看到该值。感谢@Amos M.Carpenter指出这一点。

变量是标识符。变量包含对某个对象的引用

instanceVariableNames:此处
x
属于类的实例

classVariableNames:here
Yy
有一个与所有类的所有实例共享的变量副本,它可以是静态变量。 因此,
x
可以在不同的对象上具有不同的值。但是
Yy
只能有一个值

PoolDictionary:在smallTalk中创建,用于访问一组类之间共享的变量

类别“helpme”是相关类的集合,如果您创建的类没有类别;该类使用空白类别创建


子类有自己的instanceVariableNames(zzz),也有继承属性。

为了避免非Smalltalker之间的混淆: 您键入的是一条消息(给对象类),要求它创建自己的子类,名为“MyClass”,其中有一个名为“x”的实例变量(实例专用槽)和一个名为“Yy”的类变量。之后是一条消息,指向刚刚创建的类,以定义名为“zzz”的类实例变量(即类对象中的一个插槽,而不是它的实例中的插槽)

  • 全局变量
    “对象”和“MyClass”是“全局变量”。这些都是可见的 在全球词典中,到处都有,而且在技术上是绑定的 (保留键值对)。在旧的实现中,只有一个 这样的字典;在最近的实现中,有多个名称空间,它们被称为“名称空间”。在您的示例中,发送到对象类的类定义消息将为“MyClass”名称创建这样一个新绑定

  • 类变量
    'Yy'是类变量;这也指绑定,但该绑定仅在类及其子类内部可见,包括类方法和实例方法(见下文)。所有引用相同绑定的类,因此子类将看到相同的值。它们可以在子类中重新定义,但是,重新定义的子类的所有子类都引用相同的绑定

  • 实例变量
    这些是对象的专用插槽。'在你的例子中,x’是一个。对象和方法(操作)的布局由子类继承,但当然,每个实例都有自己的值。实例变量对实例方法是可见的(当然)

  • 类实例变量
    因为类是它们自己的对象(元类的实例),所以它们也可以有私有插槽。从技术上讲,它们只是类对象的实例变量,对类方法可见。与实例变量一样,布局和方法由子类继承,但每个(类)都有自己的值。这经常被C++/Java人员误解,因为他们的语言中没有相应的构造(还要注意,类方法是继承的,可以在Smalltalk中重新定义,而其他语言中的静态函数不能)

  • 池变量(共享池)
    与类变量类似,因为它们指的是类对象非全局持有的绑定。但是,这些在许多协作类中都是可见的(类似于另一种语言中的“朋友”)。通过在类定义消息中命名池,其绑定对类和实例方法可见。通常,这些用于定义共享常量

其他变量类型(代码示例中不存在)是方法局部变量和块局部变量。这些是指当前上下文中的插槽,从技术上讲,它是方法或块(或外部上下文,如果块实际上是闭包)的堆栈帧(延续)


“category”只是类的一个属性,不能与上述变量混淆。将其视为附加在其上的标记,以便在浏览器中实现更好的组织。该属性存储位置的详细信息是特定于方言的:大多数使用单独的(所谓的“组织”),即字典。然而,至少有一种方言(ST/X)将其作为类对象的私有槽(在某种意义上,它实际上是一个变量)。

+1,尽管我认为关于类实例变量的部分不太正确。如果我没记错的话,只有类有权访问它们,而不是它的实例。子类继承它们,但有自己的值。对于来自其他语言的人来说,这一点通常很难理解,因为类本身并不是真正的对象。谢谢你指出这一点。我修正了我的答案,把它包括在内。