为什么不初始化该类/实例变量?

时间:2019-05-01 05:07:02

标签: object smalltalk gnu-smalltalk

我正在尝试使用gnu-smalltalk。在带有变量的简单类的以下代码中,我发现它没有被初始化为给定值:

Object subclass: Myclass[
    |mainval|
    mainval := 555.
    getmainval [^mainval]
]

gc := Myclass new.
gc getmainval printNl.

对象创建成功,没有任何错误。但是,输出为:

nil

我原以为是555。

如果我添加了一种方法来为其分配值,并在创建该类的实例后调用它,那么它将起作用。

问题出在哪里,如何解决?谢谢。

1 个答案:

答案 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