3
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 中调用带参数的函数的正确方法是什么?到目前为止,我读过的教程都没有回答我的问题,我仍然有点困惑。

4

5 回答 5

2

尝试学习 smalltalk 时,请使用 smalltalk 环境。不要使用命令行界面,不要使用在线网络工具。两者都非常有用,但不适合学习smalltalk。他们没有提供您需要的反馈来快速学习 smalltalk。 如果它不允许您在调试器中编写大部分代码,那么您将不会学习 smalltalk。

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

于 2013-06-24T09:44:10.787 回答
2

您在哪个类中定义了该方法?您没有指定要向哪个类发送消息(告诉它执行该方法)。

在 的情况下,您正在向全局变量(Stream 类的实例)Transcript show: 'Derp'.发送消息,并且是在其超类或其超类之一上实现的类方法。Transcriptshow:Transcript

如果该方法是在您发送的同一类上定义的,self则要使用的关键字是,所以它是self printSomething: 'Derpy'.

于 2013-06-22T21:12:32.913 回答
2

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

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

MyClass new printSomething: 'Derpy'

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

于 2013-06-22T21:19:00.640 回答
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.

于 2013-06-25T18:12:47.157 回答
2

在 gnu-smalltalk 3.2.5 中。

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

Eval [
    Transcript show: 'Derp'.
    (Example new) printSomething: 'Derpy'.
]
于 2014-01-13T19:07:17.380 回答