我正在尝试使用gnu-smalltalk。在带有变量的简单类的以下代码中,我发现它没有被初始化为给定值:
Object subclass: Myclass[
|mainval|
mainval := 555.
getmainval [^mainval]
]
gc := Myclass new.
gc getmainval printNl.
对象创建成功,没有任何错误。但是,输出为:
nil
我原以为是555。
如果我添加了一种方法来为其分配值,并在创建该类的实例后调用它,那么它将起作用。
问题出在哪里,如何解决?谢谢。
答案 0 :(得分:2)
我想您很近,但是您尝试了一个快捷方式,该快捷方式不起作用,原因是您希望在类定义(方法和局部有效性之外)中的实例变量设置值将返回值。实际上,您想在方法中使用实例变量,例如init
表示对象的内部状态。
正如我在之前的回答中所指出的那样,我不是GNU Smalltalk专家。我正在使用Smalltalk / X-jv分支进行编程。
我已自由地将您的代码重写为更多类似代码的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
消息发送到创建superclass
实例的anObject
,然后用myClass
初始化init
并重播它。
然后,您会看到init
类,它将您的实例变量初始化为您希望的值555
。
然后您就有了一个吸气剂(在Smalltalk中,通常没有 get 前缀就可以使用它,但这只是样式上的问题)mainVal
。
然后您的代码调用该对象并获取值。
gc := MyClass new.
gc mainVal
最小示例,没有重新定义new
消息:
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
555