在GNU Smalltalk中定义和调用函数的正确方法是什么?
我现在正试着自学Smalltalk,但我仍然不知道如何调用我编写的函数。我试图用参数在GNU Smalltalk中定义和调用函数的正确方法是什么?,smalltalk,gnu-smalltalk,Smalltalk,Gnu Smalltalk,我现在正试着自学Smalltalk,但我仍然不知道如何调用我编写的函数。我试图用参数'Derpy'调用函数printSomething,使用语句printSomething:'Derpy.,但它没有调用函数,而是产生了以下错误:prog.st:3:预期表达式 我在这里做错了什么?在Smalltalk中使用参数调用函数的正确方法是什么?到目前为止,我读过的教程都没有回答我的问题,我仍然有点困惑。您是在哪个类中定义这个方法的?您没有指定要将消息发送到哪个类(告诉它执行该方法) 在Transcript
'Derpy'
调用函数printSomething
,使用语句printSomething:'Derpy.
,但它没有调用函数,而是产生了以下错误:prog.st:3:预期表达式
我在这里做错了什么?在Smalltalk中使用参数调用函数的正确方法是什么?到目前为止,我读过的教程都没有回答我的问题,我仍然有点困惑。您是在哪个类中定义这个方法的?您没有指定要将消息发送到哪个类(告诉它执行该方法) 在
Transcript show:'Derp.
的情况下,您将向全局变量Transcript
(流类的一个实例)发送一条消息,show:
是在Transcript
或其一个超类上实现的类方法
如果该方法是在发送源的同一个类上定义的,
self
是要使用的关键字,因此它应该是self-printSomething:“Derpy”。
Smalltalk是一种纯面向对象的语言。您只能向对象发送消息,对象调用在其类上定义的方法
您在哪个类上定义了printSomething?如果将其定义为实例方法,则需要在该类的实例上调用它。例如:
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时,请使用smalltalk环境。不要使用命令行界面,不要使用在线web工具。这两种语言都很有用,但不是用来学习闲聊的。他们不会提供你快速学习smalltalk所需要的反馈。 如果它不允许您在调试器中编写大部分代码,您将无法学习smalltalk
为学习smalltalk而开发的书籍和环境是。从那里使用映像和虚拟机。Pharo发展很快,使用更新的版本会让人困惑 我怀疑你的错误有两方面:
MyClass new printSomething: 'Derpy'
请注意
Eval[]
块,您在gnu smalltalk 3.2.5中创建了Example
的实例,而不是NameOfSubclass
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'.
]
您的代码中有一个大写错误。方法名的大写字母为P,但您试图用小写字母P调用它。@fzwo尽管如此,即使更正了大写错误,也会产生相同的错误。我还没有弄清楚Smalltalk函数调用的正确语法。下次,请添加一个标记,说明您正在使用哪个Smalltalk。GNU Smalltalk和Squeak/Pharo在处理源代码方面的工作方式完全不同。我没有在类中定义方法:Smalltalk中的所有方法都必须在类中定义吗?那么您在哪里/如何定义它?我有点生疏,不同的Smalltalk环境做某些事情(比如在工作区中定义东西)的方式不同,但一般来说,Smalltalk非常面向对象。你不能在Smalltalk中定义函数,只能定义方法。另外:Transcript不是一个类,而是一个包含Stream类实例的全局变量。@JohanB谢谢,我已将我的答案编辑为正确的WRT Transcript。@AndersonGreen我不知道如何在ideone中创建或编辑类,抱歉。正如Johan所说,在Smalltalk中不可能定义函数,因此如果您不能在IDE中创建或编辑类,那么您就不能创建方法。我想在这种情况下,ideone除了在已有类的实例上调用方法之外,对其他任何东西都不适用(所有其他面向对象语言也是如此,除了它们中的大多数不像Smalltalk那样严格/干净地面向对象,并且允许函数).也许可以看看Pharo Smalltalk和优秀的在线书籍:www.Pharo-project.org。这可能会对您有更多帮助,尤其是对于一般的Smalltalk学习。对于GNU Smalltalk,命令行界面是Smalltalk环境!(回答)是的。所以不要用它来学习闲聊。我也不推荐托帕兹学习smalltalk。或者琥珀色(现在还需要调试器)。这个答案与哪种Smalltalk方言有关?GNU Smalltalk,它与OP链接的代码的语法相匹配。
Object subclass: Example [
printSomething: what
[
10 timesRepeat: [
Transcript show:what.
]
]
]
Eval [
Transcript show: 'Derp'.
(Example new) printSomething: 'Derpy'.
]