首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么这个类/实例变量没有被弱化?

为什么这个类/实例变量没有被弱化?
EN

Stack Overflow用户
提问于 2019-05-01 05:07:02
回答 1查看 154关注 0票数 2

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

代码语言:javascript
复制
Object subclass: Myclass[
    |mainval|
    mainval := 555.
    getmainval [^mainval]
]

gc := Myclass new.
gc getmainval printNl.

创建对象时不会出现任何错误。但是,产出是:

代码语言:javascript
复制
nil

而我原以为是555。

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

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-01 07:01:10

我认为您已经接近了,但是您尝试了一个无法工作的快捷方式,因为您期望将值设置为类定义中的实例变量(在方法和本地有效性之外)将返回值。实际上,您希望在方法(例如init )中使用实例变量来表示对象的内部状态。

正如我在以前的一些回答中所指出的,我不是GNU Smalltalk专家。我正在使用Smalltalk/X分支进行编程。

我冒昧地将您的代码重写为更多的GNU Smalltalk,类似于代码:

代码语言:javascript
复制
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消息发送给创建anObject实例的superclass,然后用init初始化myClass,然后重放。

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

然后有一个getter (在Smalltalk中,通常不带get前缀,但这只是风格上的问题) mainVal

然后,调用对象并获取值的代码。

代码语言:javascript
复制
gc := MyClass new.
gc mainVal

不需要重新定义消息的最小示例:

代码语言:javascript
复制
Object subclass: MyClass [
    | mainVal |
    <comment:
        'testing main value'>
    init [
        <category: 'initialization'>
        mainVal := 555.
    ]
    mainVal [
        ^ mainVal
    ]
]

请不要忘记,在Smalltalk中,通常不存在构造函数的默认调用,因此您必须手动发送init消息(另一个选项是像我前面所做的那样重新定义new消息)。

然后使用它看起来如下所示:

代码语言:javascript
复制
gc := MyClass new.
a MyClass
st> gc init
a MyClass
st> gc mainVal
555
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55931862

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档