我正在使用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中输入时,它不起作用。
答案 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上看起来很不错。