5

私は smalltalk は初めてで、私が学んだ他のすべてのプログラミング言語と同様に、単純な「hello world」プログラムを実行しようとしました。Pharo/Squeak で行うことは、トランスクリプト ウィンドウを開き、次のコードをワークスペース ウィンドウに入力してから、'Alt-d' を押して実行することだと学びました。

Transcript show: 'hello world'; cr.

私が理解している限り、この行は、引数「hello world」を含む「show」メッセージを Transcript オブジェクトに送信することを意味し、予想どおり、トランスクリプト ウィンドウに次のように表示されます。

hello world

ここまではうまくいきましたが、2 つ目のトランスクリプト ウィンドウを開いてコードを再度実行したところ、両方のトランスクリプト ウィンドウが次のようになっていることがわかりました。

hello world

あたかも両方のトランスクリプト ウィンドウが識別子 "Transcript" によって識別されるかのように。トランスクリプト ウィンドウはトランスクリプト ウィンドウ クラスの「インスタンス」でなければならないと思っていたので、これが私を混乱させました。したがって、それらを一意に識別する方法はありませんか?

4

2 に答える 2

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 インスタンス数 ->> 14

詳細については、「Transcript open」をデバッグしてください。

乾杯

于 2011-04-10T12:55:05.587 に答える
3

Transcript は、インスタンスを保持するグローバル変数です。それを調べてそのクラスを確認し、ローカル参照を保持する別のウィンドウを開く方法を確認します。

于 2011-04-08T11:11:57.877 に答える