如何在Pharo / Squeak中唯一标识成绩单窗口?

时间:2011-04-08 08:32:20

标签: smalltalk squeak pharo

我是smalltalk的新手,和我学过的所有其他编程语言一样,我试着做一个简单的“hello world”程序。我已经了解到,在Pharo / Squeak中,您要做的是打开一个脚本窗口,在工作区窗口中键入以下代码,然后按“Alt-d”运行它:

Transcript show: 'hello world'; cr.

据我了解,该行表示将带有参数“hello world”的“show”消息发送到Transcript对象,正如预期的那样,我的成绩单窗口现在显示:

hello world

到目前为止,当我打开第二个成绩单窗口再次运行代码时,我发现两个成绩单窗口现在都有:

hello world

好像两个抄本窗口都由标识符“Transcript”标识。这让我感到困惑,因为我认为成绩单窗口必须是成绩单窗口类的“实例”。因此,难道不应该有一种方法来唯一地识别它们吗?

2 个答案:

答案 0 :(得分:11)

这是一个复杂而优秀的问题。 Smalltalk有一个大型字典,其中存储了所有全局变量。全局通常是类,但那里可以有任何对象。它只是一个字典(键/值)。我所说的这本大字典叫做Smalltalk。写下“Smalltalk inspect”,你会看到它。它是SmalltalkImage类的唯一实例。

所以......在你的代码中键入MyClass时,这是因为在值中的“Smalltalk at:#MyClass”中,你有了类。但你也可以这样做:Smalltalk at:#mariano put:'mariano'。然后你可以到处写“mariano”,你会得到字符串'mariano'。

成绩单就是这样。在(Smalltalk at:#Transcript)中,它保留了Transcript的唯一实例。实际上,这可能不是Transcript类的实例,而是另一个。在pharo中,它是ThreadSafeTranscript的实例。检查一下:

ThreadSafeTranscript instanceCount - > 1 成绩单打开。 成绩单打开。 成绩单打开。

你将永远拥有一个。因为Transcript本身就是MODEL。不是观点。视图(打开Transcript时打开的窗口)是PluggableTextMorph的实例,其模型是Transcript的唯一实例。检查一下:

PluggableTextMorph instanceCount - >> 11 成绩单打开。 成绩单打开。 成绩单打开。 PluggableTextMorph instanceCount - >> 14

更多细节,调试“Transcript open”。

干杯

答案 1 :(得分:3)

Transcript是一个保存实例的全局变量。检查它以查看它的类,从而看到如何打开另一个窗口,您将持有本地引用。