在 Pharo Smalltalk 中初始化类变量

问题描述

我在 Pharo 中初始化类变量时遇到问题。我首先创建一个具有单个类变量的类:

Object subclass: #ClassVariableTestBehavior
    instanceVariableNames: ''
    classVariableNames: 'test'
    package: 'DummyPackage'

然后在类方面我创建了一个 initialize 消息并将变量设置为 nil。

ClassVariableTestBehavior class >>> initialize
    test := nil

我保存然后创建了一个实例方法

ClassVariableTestBehavior >>> test
    ^ test

又回去把类方法改成:

ClassVariableTestBehavior class >>> initialize
    test := 34

然后我在操场上打印了以下结果:

ClassVariableTestBehavior new test.

这是nil。为什么类变量的值没有更新为34?

解决方法

当代码最初从外部文件加载时,class>>initialize 方法仅使用一次。它不会在每次编辑方法时运行。 (如果您修改了评论,您是否希望数据被清除!?)实际上,nil 值并非来自您的方法,而只是初始默认值。

一个常见的约定是用一行可以执行的代码向 initialize 方法添加注释。

"
ClassVariableTestBehavior initialize.
"
,

我认为您对初始化感到困惑。根据您的评论,您希望创建一个在实例之间共享的常量值。

initialize 通常是为您正在创建的对象实例定义值的方法。 Smalltalk 的问题在于,并非每个 Smalltalk 实现在创建实例时都运行 initialize;所以要注意这个。

如果你想在实例之间共享价值,你可以创建一个这样的类方法:

ClassVariableTestBehavior class >> #test

地点:

test
  "Class method returning always the same value"
  ^ 34

当您想访问该值时,您只需执行以下操作:

ClassVariableTestBehavior test.

如果您想在创建自己的实例时访问它,您可以这样做:

| instance |
instance := ClassVariableTestBehavior new.
instance class test. "This accesses the class variable"

编辑 - 由于 Leandro 的出色评论,我忘了提及。

类变量应该使用大写字母! (归功于莱安德罗)

如果您希望将值存储在类变量中,而不是像我上面显示的那样在方法中存储常量值。您可以使用类变量来实现。

如果您将类变量定义为 Test,那么您需要为它设置一个 getter 和 setter。

你会:

ClassVariableTestBehavior class >> #test

test
  "returns value of class variable"
  ^ Test

ClassVariableTestBehavior class >> #test:

test: aNumber
  "sets the value of class variable"
  Test := aNumber

您将以与上述相同的方式访问该值(就在编辑之前)。