我在试着用gnu-smalltalk。在下面使用变量的简单类的代码中,我发现它没有被初始化为给定的值:
Object subclass: Myclass[
|mainval|
mainval := 555.
getmainval [^mainval]
]
gc := Myclass new.
gc getmainval printNl.创建对象时不会出现任何错误。但是,产出是:
nil而我原以为是555。
如果我添加一个方法来为它赋值并在创建类的实例之后调用它,它就能工作。
问题在哪里,如何纠正?谢谢。
发布于 2019-05-01 07:01:10
我认为您已经接近了,但是您尝试了一个无法工作的快捷方式,因为您期望将值设置为类定义中的实例变量(在方法和本地有效性之外)将返回值。实际上,您希望在方法(例如init )中使用实例变量来表示对象的内部状态。
正如我在以前的一些回答中所指出的,我不是GNU Smalltalk专家。我正在使用Smalltalk/X分支进行编程。
我冒昧地将您的代码重写为更多的GNU Smalltalk,类似于代码:
Object subclass: MyClass [
| mainVal |
<comment:
'testing main value'>
MyClass class >> new [
<category: 'instance creation'>
| myClass |
myClass := super new.
myClass init.
^ myClass
]
init [
<category: 'initialization'>
mainVal := 555.
]
mainVal [
^ mainVal
]
]解释如下:
我正在定义mainVal实例变量。然后,我将重新定义一个类方法new,它是不需要的,但为了说明起见,我正在这样做。( new消息是从Object类继承的)
我在类方法new中所做的事情。我将new消息发送给创建anObject实例的superclass,然后用init初始化myClass,然后重放。
之后,您可以看到init类,它将实例变量初始化为您希望的555值。
然后有一个getter (在Smalltalk中,通常不带get前缀,但这只是风格上的问题) mainVal。
然后,调用对象并获取值的代码。
gc := MyClass new.
gc mainVal不需要重新定义消息的最小示例:
Object subclass: MyClass [
| mainVal |
<comment:
'testing main value'>
init [
<category: 'initialization'>
mainVal := 555.
]
mainVal [
^ mainVal
]
]请不要忘记,在Smalltalk中,通常不存在构造函数的默认调用,因此您必须手动发送init消息(另一个选项是像我前面所做的那样重新定义new消息)。
然后使用它看起来如下所示:
gc := MyClass new.
a MyClass
st> gc init
a MyClass
st> gc mainVal
555https://stackoverflow.com/questions/55931862
复制相似问题