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

How to create a method using the Playground/Workspace (and not through the System Browser)?

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

假设我创建了一个 Cat class

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

要添加一个方法makeSoundCat,我可以在系统浏览器中找到它

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 中输入时它不起作用。

此语法主要用于将方法插入文档。它不是可以直接在系统浏览器或 Playground 中执行的东西。例如采用您的方法:

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

这只是告诉 reader 方法 makeSound 在 class Cat 中。它不可执行。它应该是 Cat>>makeSound 而不是 Cat class>>makeSound。第二个表示方法在class这边。

您可以通过编译将方法添加到工作区中的 class:

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

您还可以使用消息>>Cat>>#makeSound 从class 直接访问已编译的方法对象。一旦你有了这个方法对象,你也可以在一个对象上执行它:

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

如果您使用 "File Out" 功能并检查生成的代码,您会注意到使用感叹号的语法。这不是最易读的语法,也不适合人类阅读或编写。

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

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

即使您想开发更传统的脚本式程序,我也建议您尝试使用系统浏览器来开发它,并且只求助于 Playground 进行一些快速实验。 Pharo 在部署 "headless" 应用程序方面做得越来越好,所以这不会成为问题。

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