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

标签 object smalltalk gnu-smalltalk

我正在尝试使用 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 的实例,然后初始化myClassinit然后返回它。

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

关于object - 为什么这个类/实例变量没有被初始化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55931862/

相关文章:

debugging - GNU Smalltalk 80 调试器。如何调试smallcode代码?启动调试器?

smalltalk - 在 GNU Smalltalk 中定义和调用函数的正确方法是什么?

Javascript - 对象数组,对象包含另一个数组和一个 int

arrays - 使用 Request 模块发布数组/对象

multithreading - 什么是特定于流程的变量?

observer-pattern - 公告与经典 Smalltalk-80 依赖/更改/更新机制有何关系?

smalltalk - 如何使用多行输入来创建我的游戏?

javascript - 如何在函数中使用该对象作为参数以及如何调用该函数

ios - objective-c "callback"

smalltalk - 在 Seaside 应用程序中实现类似 URL 的 REST 的最佳方式是什么?