メソッドが定義されているクラスを探す
404 Blog Not Found:perl - UNIVERSAL::which 経由で、どのクラスで定義されたメソッドなのか - にぽたん研究所 を読んでいて、Smalltalk でも、あるメソッドを起動できることは分かっているのだけれど、それがどのクラスに定義されているのか分からない…というのは初学者の FAQ だなぁ、と思いました。
もちろん Squeak システムの場合、GUI ツールとして「プロトコルブラウザ」というのが用意されているので、この存在を知っていてちゃんと使えればよいのですが、オブジェクトへのメッセージ送信で一発でできないものか…と、探してみたところ、#whichClassIncludesSelector: という便利なメソッドを見つけました。
使い方は簡単で、注目しているオブジェクトのクラスに対して、調べたいメソッド名(セレクタ)と同名のシンボルをパラメータ(引数)として添えて送信するだけです。
#(1 2 3 4) allButFirst " => #(2 3 4) "
#(1 2 3 4) class " => Array "
Array whichClassIncludesSelector: #allButFirst " => SequenceableCollection "
なお、いくら便利でも、こんな長ったらしいメソッド名をいちいち覚えていられない…という向きは「whichcl」まで覚えられれば大丈夫です。そこまでタイプして alt/cmd + q とタイプすれば、Squeak システムが残りを一意に補完してくれますので( cl のところの c は小文字でかまいません)。
ちなみに、プロトコルブラウザを起動するには、システムブラウザなどで、そのクラスリスト枠か、メソッド名リスト枠の中にマウスポインタを入れてフォーカスしてから、alt/cmd + p をタイプするか、その表示枠の黄ボタンメニューから「browse protocol (p)」を選択…という操作をします。
クラス定義(つまり、スーパークラス群からの差分)をブラウズするのに便利なシステムブラウザと異なり、プロトコルブラウザは、そのクラスのインスタンスがメッセージ受信により起動可能なメソッドの一覧ができるブラウザです。
ただ、継承ツリーの頂点である ProtoObject までブラウズすると、かえって必要なメソッドを探しにくくなったりすることもあるので、ウインドウ中央左寄りに設置された「Only through ...」ポップアップで、さかのぼるクラスのリミットを指定できるようになっています。