我正在使用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中键入它时,它不起作用。
此语法主要用于将方法插入到文档中。它不能直接在系统浏览器或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: #().
如果使用“文件输出”功能并检查生成的代码,您会注意到使用感叹号的语法。这不是最易读的语法,不应由人类阅读或编写。
与Squeak一样,Pharo遵循Smalltalk-80的理念,即利用GUI提供多种工具,如Playground,Debugger,Inspector和System Browser,每种工具都提供非常专业的功能。这是因为Smalltalk(和一些派生语言,如Self)不仅仅是代码,而是对象和消息,而那些可以有多种表示,通常是可视化的。
事物的美妙之处在于,所有内容都是使用这个比喻来定义的,包括环境工具。因此,您可以轻松地更改它们以适应您的开发风格,或者安装和使用另一个,如Calypso。
即使您想开发更传统的脚本式程序,我建议您尝试使用系统浏览器进行开发,并仅使用Playground进行一些快速实验。 Pharo在部署“无头”应用程序方面越来越好,所以它不会成为问题。
如果您担心Git,请查看Iceberg。它以一种最易读的方式序列化您的代码,因此您的差异在Github上看起来很不错。