问题描述
我在 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
您将以与上述相同的方式访问该值(就在编辑之前)。