Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/image-processing/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在GNU Smalltalk中定义和调用函数的正确方法是什么?_Smalltalk_Gnu Smalltalk - Fatal编程技术网

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

在GNU Smalltalk中定义和调用函数的正确方法是什么?,smalltalk,gnu-smalltalk,Smalltalk,Gnu Smalltalk,我现在正试着自学Smalltalk,但我仍然不知道如何调用我编写的函数。我试图用参数'Derpy'调用函数printSomething,使用语句printSomething:'Derpy.,但它没有调用函数,而是产生了以下错误:prog.st:3:预期表达式 我在这里做错了什么?在Smalltalk中使用参数调用函数的正确方法是什么?到目前为止,我读过的教程都没有回答我的问题,我仍然有点困惑。您是在哪个类中定义这个方法的?您没有指定要将消息发送到哪个类(告诉它执行该方法) 在Transcript

我现在正试着自学Smalltalk,但我仍然不知道如何调用我编写的函数。我试图用参数
'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'.
]