为什么没有初始化这个类/实例变量?

问题描述 投票:1回答:1

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

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

gc := Myclass new.
gc getmainval printNl.

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

nil

虽然我原以为它是555。

如果我添加一个方法来为它赋值并在创建类的实例后调用它,它就可以工作。

问题在哪里以及如何纠正?谢谢。

object smalltalk gnu-smalltalk
1个回答
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值。

然后你有一个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
© www.soinside.com 2019 - 2024. All rights reserved.