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

标签 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 流中。

现在,我不知道如何使用“控制台”完成所有这些操作。在 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。第二个表示该方法在类端。

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

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

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

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

关于oop - 如何使用 Playground/Workspace(而不是通过系统浏览器)创建方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47926445/

相关文章:

smalltalk - 获取 CompiledMethod 类的实例

smalltalk - 如何每小时自动保存一张 Pharo 图像?

multithreading - Smalltalk Visual Works并发

smalltalk - 规范 - 我想替换 SpPanedLayout 中的第一个演示者

settings - Pharo 中的彩色窗口主题?

smalltalk - Cog VM 和间接变量访问

c++ - 如何从 HashTable C++ 中选取最大前 10 个数量?

java - 为什么java.lang.Object中的clone()方法受到保护?

python - 什么是 Python 中的对象引用?

c# - 让类实现不同接口(interface)以限制客户端操作时的设计问题