如何使用Playground / Workspace(而不是通过系统浏览器)创建方法?

问题描述 投票:2回答:2

我正在使用Pharo + Squeak学习Smalltalk。我尝试使用Playground / Workspace作为控制台,并弄清楚如何在那里做所有事情。我还没想到的一件事是如何在类中添加方法。

假设我创建了一个Cat

Object subclass: #Cat
    instanceVariableNames: ''
    classVariableNames: ''
    package: 'User Defined'.

要将方法makeSound添加到Cat,我可以在系统浏览器中找到它

Cat browse.

并在那里创建一个新的makeSound方法

makeSound
    "Make Cat object make sound."
    Transcript show: 'Meow!'.

然后我可以实例化Cat并发送一个makeSound消息

cat := Cat new.
cat makeSound.

并且Meow!将按照预期在Transcript流上显示。

现在,我不知道如何使用“控制台”完成所有这些操作。在Pharo by Example书中,提到引用方法的约定是使用ClassName>>methodName,并且有一些代码片段看起来像这样(我可能正在屠杀它!)

Cat class>>makeSound
  Transcript show: 'Meow!'.

当我在Playground / Workspace中键入它时,它不起作用。

oop smalltalk pharo squeak
2个回答
4
投票

此语法主要用于将方法插入到文档中。它不能直接在系统浏览器或Playground中执行。例如,采取您的方法:

Cat>>makeSound
    Transcript show: 'Meow!'.

这只是告诉读者,方法makeSound在类Cat中。它不可执行。它应该是Cat>>makeSound而不是Cat class>>makeSound。第二个表明该方法是在类侧。

您可以通过编译从Workspace向类添加方法:

Cat 
  compile: 'makeSound
    "Make Cat object make sound."
    Transcript show: ''Meow!''.'
  classified: 'actions'.

您还可以使用message>>Cat>>#makeSound直接从类中访问已编译的方法对象。拥有此方法对象后,您还可以在对象上执行它:

(Cat>>#makeSound) valueWithReceiver: Cat new arguments: #().

3
投票

如果使用“文件输出”功能并检查生成的代码,您会注意到使用感叹号的语法。这不是最易读的语法,不应由人类阅读或编写。

与Squeak一样,Pharo遵循Smalltalk-80的理念,即利用GUI提供多种工具,如Playground,Debugger,Inspector和System Browser,每种工具都提供非常专业的功能。这是因为Smalltalk(和一些派生语言,如Self)不仅仅是代码,而是对象和消息,而那些可以有多种表示,通常是可视化的。

事物的美妙之处在于,所有内容都是使用这个比喻来定义的,包括环境工具。因此,您可以轻松地更改它们以适应您的开发风格,或者安装和使用另一个,如Calypso。

即使您想开发更传统的脚本式程序,我建议您尝试使用系统浏览器进行开发,并仅使用Playground进行一些快速实验。 Pharo在部署“无头”应用程序方面越来越好,所以它不会成为问题。

如果您担心Git,请查看Iceberg。它以一种最易读的方式序列化您的代码,因此您的差异在Github上看起来很不错。

© www.soinside.com 2019 - 2024. All rights reserved.