1 名前:デフォルトの名無しさん mailto:sage [2005/11/07(月) 16:47:13 ] 全然スレ立たないけどみんな興味無いの? いっしょに遊びましょ♪
101 名前:デフォルトの名無しさん mailto:sage [2006/05/06(土) 01:13:43 ] >>98 > ・なぜ「open」という存在を知っていたのか、 知りませんでした。が、クラスメソッドで見つけました。 > ・それがインスタンスでなくてクラスである理由 いろいろと複雑な事情がありますが、簡単にいえば単なる慣習です。 MVC でいうところの M(モデル)の属するクラスのクラスメソッドに V や C を担当する クラスと関連付けをする作業を定義することをよくします。 > ちなみに、Morphにおける「new」というメソッドは > なぜ有効なんでしょう。 #new は Behavior に定義されています。 Morph はクラスですが、自身もインスタンスです。属するクラスは無名ですが、 便宜的に Morph class と呼称します。いわゆるメタクラスというやつです。 メタクラスのスーパークラスパスは、原則としてそのインスタンスである クラスのスーパークラスパスと同じです。したがって、Morph class の スーパークラスをたどると ProtoObject class に行き着きます。 ProtoObject class は ProtoObject と違って、さらにスーパークラスがあります。 それが、Class です。そこからは普通に ClassDescription、Behavior とたどることができます。 | superclass | World findATranscript: nil. superclass := Morph class superclass. [superclass isNil] whileFalse: [ Transcript cr; show: superclass. superclass := superclass superclass] 余談ですが、このスクリプトの全角スペースをタブに置き換えるには、 最初の全角スペースを削除してタブをタイプした後、alt + shift + j としてみてください。 again という機能です。
102 名前:デフォルトの名無しさん mailto:sage [2006/05/06(土) 01:26:42 ] >>100 インスペクタの左側のペインで model をダブルクリックしてください。 新しいインスペクタが現れて、これのインスペクタワークスペース(下のペイン)で self に束縛した a TelnetMachine にメッセージを投げれます。 そんなことをせずとも元のインスペクタのインスペクタワークスペースで model に対して メッセージを送ってもよいでしょう。 どうしてもワークスペースを使いたい(例えば、ワークスペース変数が好き、とかの) 理由があるならば、グローバル変数に model を束縛しておくという手もあります。 Smalltalk at: #MYTELNET put: model これで、ワークスペースからでも MYTELNET でアクセスできます。
103 名前:デフォルトの名無しさん mailto:sage [2006/05/06(土) 01:31:41 ] >>102 どうして model に a TelnetMachine が束縛されているのをしっているのか? という質問がきそうなので先に答えておくと、それは、TelnetMachine class >> #open の定義をざっと見たからです。
104 名前:デフォルトの名無しさん mailto:sage [2006/05/06(土) 02:06:50 ] あと、メソッド名が分かっている場合、たとえば今の場合 #new なら、new を (必要ならタイプして入力して)選択した後、browse it (alt + b) か、 implementors of it (alt + m) すれば、定義をブラウズできます。 もちろん同名メソッドがあったり、オーバーライドされている場合は、 適切なクラスを探さないといけませんが…。クラスが分かっているなら 後述のプロトコルブラウザを活用したほうがよいでしょう。 メソッド名の一部しか分からない場合は、その文字列を選択して selectors containing it (alt + shift + W) をします。 メソッドの機能しか分からないときはメソッドファインダが便利です。 (デスクトップメニュー → open... → method finder で起動) <<レシーバ>>. <<第一パラメータ>>. <<第二パラメータ>>. …. <<返り値>> というようにレシーバ、パラメータ群、結果をピリオドで区切って入れると、 そういう結果を返してくるメソッドを列挙してくれます。 クラスの定義を見るのにシステムブラウザは有効ですが、あるオブジェクトが 起動可能なメソッド(受信可能なメッセージ)を一覧するのには向きません。 そういう目的にはプロトコルブラウザを使います。そのオブジェクトの属する クラスをシステムブラウザでブラウズしている状態で、クラスペインか、 メソッド名ペインにポインタを合わせて alt + p をタイプします。(あるいは、 黄ボタン=右クリック メニューから browse protocol を選択)