【问题标题】:Why this class/instance variable is not being intialized?为什么这个类/实例变量没有被初始化?
【发布时间】:2019-05-01 05:07:02
【问题描述】:

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

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

gc := Myclass new.
gc getmainval printNl.

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

nil

虽然我预计它会是 555。

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

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

【问题讨论】:

    标签: object smalltalk gnu-smalltalk


    【解决方案1】:

    我认为您很接近,但您尝试了一个不起作用的快捷方式,因为您期望在类定义中(在方法和本地有效性之外)为实例变量设置值将返回值。实际上,您想在方法中使用实例变量,例如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 的实例,然后用init 初始化myClass,然后将其返回。

    之后您可以看到 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
    

    【讨论】:

    • 解释得很好。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 2022-01-02
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 2023-03-03
    相关资源
    最近更新 更多