【问题标题】:How to uniquely identify a transcript window in Pharo/Squeak?如何唯一标识 Pharo/Squeak 中的转录窗口?
【发布时间】:2011-08-01 08:11:05
【问题描述】:

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

Transcript show: 'hello world'; cr.

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

hello world

到目前为止一切顺利,但是,当我打开第二个脚本窗口并再次运行代码时,我发现两个脚本窗口现在都有:

hello world

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

【问题讨论】:

    标签: smalltalk squeak pharo


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

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

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

      而且你将永远拥有一个。因为成绩单本身就是模型。不是景色。视图(打开 Transcript 时打开的窗口)是 PluggableTextMorph 的实例,其模型是 Transcript 的唯一实例。检查它:

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

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

      干杯

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-01-14
        • 1970-01-01
        • 1970-01-01
        • 2013-07-19
        • 1970-01-01
        • 2023-03-31
        • 1970-01-01
        相关资源
        最近更新 更多