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

时间:2013-06-22 20:57:25

标签: smalltalk gnu-smalltalk

Transcript show: 'Derp'.

printSomething: 'Derpy'.

"The method above produced this error:"
"prog.st:3: expected expression"

printSomething: what
    10 timesRepeat: [
        Transcript show:what.
        Transcript cr.
    ].

我现在正在尝试自学Smalltalk,而我仍然没有想出如何调用我编写的函数。我尝试使用语句printSomething使用参数'Derpy'调用函数printSomething: 'Derpy'.,但不是调用函数,而是产生以下错误:prog.st:3: expected expression

我在这里做错了什么,以及在Smalltalk中使用参数调用函数的正确方法是什么?到目前为止,我读过的所有教程都没有回答我的问题,我仍然有点困惑。

5 个答案:

答案 0 :(得分:2)

Smalltalk是一种纯粹面向对象的语言。您只能向对象发送消息,这些对象会调用在其类中定义的方法。

你在哪个班级定义了printSomething?如果将其定义为实例方法,则需要在该类的实例上调用它。 E.g:

MyClass new printSomething: 'Derpy'

如果将其定义为类方法,则可以将其直接发送给类本身。

答案 1 :(得分:2)

在尝试学习smalltalk时,请使用smalltalk环境。不要使用命令行界面,不要使用在线Web工具。两者都非常有用,但不是为了学习smalltalk。它们不提供您学习smalltalk所需的反馈。 如果它不允许您在调试器中编写大部分代码,则不会学习smalltalk。

为了学习smalltalk而开发的书和环境是Pharo By Example。从那里使用图像和vm。 Pharo正在快速发展,使用更新的版本会令人困惑。

答案 2 :(得分:2)

我怀疑你的错误是双重的:

Object class: #Example [
    instanceVariableNames: ''
    classVariableNames: ''
    poolDictionaries: ''
    category: 'Smalltalk Examples'
]

Example class extend [
    printSomething: what
        10 timesRepeat: [
            Transcript show:what.
        ]
]

Eval [
    Transcript show: 'Derp'.
    (Example new) printSomething: 'Derpy'.
]

请注意Eval []块,并创建Example的实例,而不是NameOfSubclass

答案 3 :(得分:1)

你在哪个班级定义了这个方法?您没有指定发送消息的类(告诉它执行该方法)。

对于Transcript show: 'Derp'.,您将向全局变量Transcript(Stream类的实例)发送消息,而show:是在{上实现的类方法{1}}或其中一个超类。

如果方法是在您发送的同一个班级上定义的,Transcript是要使用的关键字,那么它将是self

答案 4 :(得分:1)

在gnu-smalltalk 3.2.5。

Object subclass: Example [
    printSomething: what
    [
        10 timesRepeat: [
            Transcript show:what.
        ]
    ]
]

Eval [
    Transcript show: 'Derp'.
    (Example new) printSomething: 'Derpy'.
]