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