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

时间:2017-12-21 13:53:54

标签: oop smalltalk pharo squeak

我正在使用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流中显示。

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

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

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

2 个答案:

答案 0 :(得分:4)

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

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

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

您可以通过编译方法从工作区向类添加方法:

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

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

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

答案 1 :(得分:3)

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

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

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

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

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