【问题标题】:Smalltalk own new methodSmalltalk 自己的新方法
【发布时间】:2013-02-20 04:07:42
【问题描述】:
Object subclass: Node [     

    |value|

    new [
        Transcript show: 'Test'.
            value := 6.
    ]

    getValue [
        ^value.
    ]

    set:sth [
        value := sth.
    ]

]

|data|
data := Node new.
Transcript show: (data getValue) printString ; cr. "nil"
data set:5.
Transcript show: (data getValue) printString. "5"

问题是从未调用过new 方法,因此我无法设置值或调用初始化函数。此外,在类似的事情之后:

object := Node new. "Not called"
object new. "Here is called"

方法被调用。如何解决?

【问题讨论】:

  • 那是 GNU Smalltalk 吗?
  • 嗯...我想是的,它会改变什么吗?其实到现在我才刚刚开始在ideone下编译。

标签: smalltalk gnu-smalltalk


【解决方案1】:

#new 必须在 Node class 上定义才能工作:

Object subclass: Node [     

    |value|

    getValue [
        ^value.
    ]

    set: sth [
        value := sth.
    ]

]

Node class extend: [
    new [ | node |
        Transcript show: 'Test'.
        node := (super new).
        node set: 6.
        ^ node
    ]
]

注意在这种情况下value不能从#new访问,所以必须调用setter

【讨论】:

  • 非常感谢。你们俩。
【解决方案2】:

据我了解,您将 new 定义为实例的方法而不是类。

当您调用Node new 时,会向类对象Node 发送一条消息,它会创建一个您自己的实例并将其分配给object 变量。然后,当您将new 发送到该变量时,接收者是Node 的一个实例,并且具有您定义的new

这是一个关于如何在 GNU Smalltalk http://www.gnu.org/software/smalltalk/manual/html_node/Defining-methods.html 中向类添加方法的示例

【讨论】:

  • @Fuv 你在用什么smalltalk?也许你应该定义一个方法为class>>new [...
  • 我已经检查过了,它是 GNU Smalltalk gst 3.1 关于你的提议我得到:prog.st:5: key class not found
  • @Fuv 将 url 添加到答案中的文档中
猜你喜欢
  • 2011-07-07
  • 1970-01-01
  • 1970-01-01
  • 2011-02-06
  • 2023-03-28
  • 1970-01-01
  • 2022-12-14
  • 2020-06-05
  • 1970-01-01
相关资源
最近更新 更多