![]() |
[1999 年 4 月号] |
[Happy Squeaking!!]
3.Squeak演習:イントロスペクション
3.2 オブジェクトの振る舞いを調べる
特定メッセージに答えられるかを聞く
次はOrderedCollectionのインスタンスに対して、特定のメッセージが答えられるかを尋ねてみることにしましょう。
ワークスペースで以下を"print
it"してください。
| ord | ord := OrderedCollection new. ord respondsTo: #add:. "OrderedColectionにadd:メッセージが答えられるか聞く" => true
respondsTo: の後に書くのはメッセージ名(セレクタ)です。メッセージ名にパラメータの名前は含まれません。例えば引数が二つの場合は、#at:put:という形になります。
先頭に#のついた文字列は、通常の文字列ではなくSmalltalkではシンボルと呼ばれています。これは、書き換え不能な文字列でSmalltalkのVM内に同一内容の文字列が必ず一つしかないことが保証されるものです。(#add: というシンボルを作成したらそのコピーは存在できない)。高速な検索ができるため、辞書のキーなどによく利用されます。 |
respontdTo:
の後をいろいろと変えて試してみましょう。
うまくいけばadd:のほかにもOrderedCollectionインスタンスの理解できる操作が見つかるかもしれません。
| ord | ord := OrderedCollection new. ord respondsTo: #fooBar. => false
OrderedCollectionのインスタンスを生成するまでもなく、OrderedCollectionのクラスに対しても、同様の問い合わせができます。
OrderedCollection canUnderstand: #add: => true
実は、respondsTo: は、canUnderstand:
を使って実現しています。
以下を"do it"して確認してみてください。
Smalltalk browseAllImplementorsOf: #respondsTo:
respondtTo: の実装
respondsTo:はルートのクラスであるObjectにおいて定義されており、内部で自分のクラスを得て、そのクラスに対して、canUnderstandを送っています。これも、インタンスからクラスをイントロスペクションで得ることのできる機能をうまく利用しした例といえます。
特定クラスの提供する操作のリストを得る
今度は、クラスが実装する操作の集合を得ることにします。
先ほどはOrderedCollectionインスタンスの理解できるメッセージを、あてずっぽうで調べましたが、以下のように、OrderedCollectionクラスに対し、クラスの提供する操作を問い合わせれば、そのような地道な努力をせずにすみます。
"OrderedCollction自身で提供された操作の集合を得る" OrderedCollection selectors
"スーパークラスも含め、OrderedCollectionが提供できる全ての操作を得る" OrderedCollection allSelectors
結果は省略します。OrderedCollection以外のクラスでもいろいろ試してみてください。
© 1999-2001 OGIS-RI Co., Ltd. |
|