在 pharo 中,可以 运行 在 playground 和 transcript 中编写代码。分别什么时候做?

In pharo, it's possible to run code inside both playground and transcript. When to do each?

在 Pharo 中,通常 运行 在 Playground 中编写代码,并使用 Transcript 打印输出。但我注意到也可以在 Transcript 中 运行 编码,而不仅仅是在那里打印内容。例如,如果我输入:

Transcript clear.

里面的成绩单window,按Ctrl+D运行,window会被清除。所以我的问题是,什么时候在 Transcript window 而不是 Playground 中使用 运行 代码才有意义?有用例吗?

为了回答您的问题,我们需要弄清楚一些事情:

您可以 运行 任何代码(几乎)在图像中的任何位置。因此,如果您打开一个方法,例如,在某处键入 Transcript clear、select,然后按 Ctrl+D,转录本 window 将被清除。

Transcript 只是链接到 window 的“单例”,可以轻松输出一些文本并在某处查看。自己构建类似的功能并不难,或者您甚至可以输出到文件中。成绩单只是为了在故障排除期间方便 activity。我仍然建议首先使用调试器,但可能存在调试器无法解决的情况。

Playground 是一种旨在“玩”您的代码的工具。它与检查器配对,因此无论何时 运行 一些代码,您都可以以用户友好的方式检查生成的对象。还有一些其他功能,例如浏览变量绑定或存储代码片段,或浏览 playground 代码历史记录。正如我之前提到的,您可以在任何地方 运行 任何代码,但 Playground 针对尝试内容进行了优化。

Transcript 和 Playground 之间的一些差异

  1. 您可以从任何地方参考 Transcript 在上面打印。你不能对 Playgrounds 做同样的事情。

  2. 由于 Transcript 是全局的,您的脚本可能会变脏或被清除。其实在Transcript上打印警告信息之类的方法有很多。您可以通过搜索其参考资料找到它们。

  3. 临时文件是在 Playgrounds 中自动创建的。您必须在 Transcript 脚本中明确声明它们。

  4. 在 Smalltalk 的某些方言中(不是 Pharo),关闭 Transcript 将关闭系统。游乐场(a.k.a。工作区)可以在所有方言中自由打开和关闭。

  5. Transcript里面有一个Find命令(猜猜为什么。)

  6. Transcript 是一个 WriteStream:它响应 #nextPutAll:#flush 等。您可以使用它来测试旨在将内容转储到任何类似流的对象(例如文件)上。


上述 3 的重要结果是您可以将评估结果存储在 Playground 临时文件中。在您关闭 Playground 之前,这些将一直可用。相反,在 Transcript 中,任何临时值的值只会在您的代码被评估时持续存在,因此您将没有机会只能打印结果以使其保持可见,这比 Playground 行为要受限得多,您可以稍后回来检查或继续使用您的结果对象进行进一步的实验。


在我看来,将 Playground 用于重要脚本并不是一个好主意。最好创建一个 class 并在其中放入一些方法。要尝试您的代码,请使用单元测试(同样是 classes 和方法)。这样,代码将被组织起来、可搜索、class可访问等,并且您的“脚本”将变得如此短,以至于您不需要任何 Playground。


Transcript应该有两个区域。一个用于 output,另一个用于 input。输出区域将显示 Transcript show: <whatever>Transcript nextPutAll: <string> 产生的消息、注释和结果。输入区域应该相当于一个简化的 Playground,这样可以省去您打开一个 Playground 来评估您很快就会丢弃的短代码片段的任务。