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

Object 为什么这个类/实例变量没有被初始化?,object,smalltalk,gnu-smalltalk,Object,Smalltalk,Gnu Smalltalk,我正在尝试使用gnu smalltalk。在以下带有变量的简单类的代码中,我发现它没有初始化为给定值: Object subclass: Myclass[ |mainval| mainval := 555. getmainval [^mainval] ] gc := Myclass new. gc getmainval printNl. 创建对象时没有任何错误。但是,结果是: nil 而我原以为是555 如果我添加一个方法给它赋值,并在创建类的实例后调用它,它就会工

我正在尝试使用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
    ]
]
最小示例不带
新的
消息重新定义:

Object subclass: MyClass [
    | mainVal |
    <comment:
        'testing main value'>
    init [
        <category: 'initialization'>
        mainVal := 555.
    ]
    mainVal [
        ^ mainVal
    ]
]

解释得很好。
Object subclass: MyClass [
    | mainVal |
    <comment:
        'testing main value'>
    init [
        <category: 'initialization'>
        mainVal := 555.
    ]
    mainVal [
        ^ mainVal
    ]
]
gc := MyClass new.
a MyClass
st> gc init
a MyClass
st> gc mainVal
555