2011-04-08 6 views
5

私はsmalltalkには新しく、他のすべてのプログラミング言語と同様に、私は単純な "hello world"プログラムをやろうとしました。私は、ファロ/ Squeakの中で何を行うことはトランスクリプト・ウィンドウを開くことであることを学んだワークスペースウィンドウに次のコードを入力し、それを実行するために、「Altキーd」を押した:Pharo/Squeakでトランスクリプトウィンドウを一意に識別する方法は?

Transcript show: 'hello world'; cr.

限り私はラインはトランスクリプトオブジェクトに引数を指定して「ショー」のメッセージを送るの「Hello World」を意味し、予想通り、私のトランスクリプトウィンドウが表示さ、理解:

hello world

をこれまでのところは良い、しかし、ときに私2番目の転写ウィンドウを開き、コードを再度実行したところ、転写ウィンドウは現在、 VEの:

hello world

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

答えて

11

これは複雑で優れた質問です。 Smalltalkには、すべてのグローバルが格納される大きな辞書があります。グローバルは通常クラスですが、そこにはオブジェクトがあります。単なる辞書(キー/値)です。私が話しているこの大きな辞書はSmalltalkと呼ばれています。 「Smalltalk inspect」と記入してください。 SmalltalkImageクラスの一意のインスタンスです。

あなたのコードにMyClassと入力すると、これは値の "Smalltalk at:#MyClass"にクラスがあるためです。しかし、次のようにすることもできます:Smalltalk at:#mariano put: 'mariano'。それから、どこにでも「マリアーノ」と書くことができます。そして、あなたは文字列「マリアーノ」を手に入れます。

トランスクリプトはそうです。 (Smalltalk at:#Transcript)では、Transcriptの一意のインスタンスが保持されます。実際、Transcriptクラスのインスタンスではなく、別のクラスのインスタンスである可能性があります。 pharoでは、ThreadSafeTranscriptのインスタンスです。これを確認してください:

ThreadSafeTranscript instanceCount - > 1 大文字が開きます。 口頭が開きます。 口頭が開きます。

あなたは常に1つを持っています。トランスクリプト自体がMODELであるためです。ビューではありません。ビュー(Transcriptを開いたときに表示されるウィンドウ)は、モデルがTranscriptの一意のインスタンスであるPluggableTextMorphのインスタンスです。それを確認してください:

PluggableTextMorph instanceCount - >> 11 トランスクリプトが開きます。 口頭が開きます。 口頭が開きます。 PluggableTextMorph instanceCount - >> 14

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

乾杯

+0

詳細な回答ありがとうございます – oscarkuo

3

トランスクリプトは、インスタンスを保持するグローバル変数です。それを見てクラスを見て、ローカル参照を保持する別のウィンドウを開く方法を見てください。

関連する問題