我正在尝试使用gnu-smalltalk。在下面带有变量的简单类的代码中,我发现它没有被初始化为给定值:
Object subclass: Myclass[
|mainval|
mainval := 555.
getmainval [^mainval]
]
gc := Myclass new.
gc getmainval printNl.
创建对象时没有任何错误。但是,输出是:
nil
虽然我原以为它是555。
如果我添加一个方法来为它赋值并在创建类的实例后调用它,它就可以工作。
问题在哪里以及如何纠正?谢谢。
我认为你很接近但你尝试了一个不起作用的快捷方式,因为你期望在类定义(方法和本地有效性之外)中设置值到实例变量将返回值。实际上,您希望在方法中使用实例变量,例如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
值。
然后你有一个getter(在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