为什么这个 class/instance 变量没有被初始化?

Why this class/instance variable is not being intialized?

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

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

gc := Myclass new.
gc getmainval printNl.

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

nil

虽然我预计它是 555。

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

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

我认为你很接近,但你尝试了一个不起作用的快捷方式,因为你期望在 class 定义中(在方法和本地有效性之外)将值设置为实例变量return 值。实际上,您想在方法中使用实例变量,例如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 实例变量。然后我重新定义了一个 class 方法 new ,它 不需要 但出于说明目的我这样做了。 (new 消息继承自 Object class)

我在 class 方法中所做的事情 new。我将 new 消息发送到创建 anObject 实例的 superclass,然后用 init 初始化 myClass,然后返回它。

之后您可以看到 init class 将您的实例变量初始化为您希望的值 555

然后你有一个 getter(在 Smalltalk 中通常没有 get 前缀,但这是 "only" 风格问题) 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