第13回
■
■SqueakではじめるSmalltalk入門 第13回
■
本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今回は、生きたオブジェクトをそのまま観察できる「インスペクタ」を解説します。
Smalltalkシステムは、すべてがオブジェクトで構成されており、オブジェクトは必ず何らかのクラスに属しています。他方でクラスは、オブジェクトの設計図と言うべき存在で、そのクラスに属するオブジェクト(インスタンス)が内部にいくつのメモリ(インスタンス変数)を持ち、どんなメッセージに応答でき(セレクタ、メソッド名、あるいはメッセージパターン)、そのときどんな振る舞いをするか(メソッド)を定義するのに用いられます。
この“オブジェクトの定義”を閲覧するためのツールが「システムブラウザ」として存在するならば、そのインスタンスとして実在するオブジェクトの内部状態、すなわち、インスタンス変数にどんなオブジェクを束縛しているのかを観察できる道具も、当然、欲しくなります。そのためのツールが「インスペクタ」です。
あるオブジェクトを観察するためのインスペクタを起動するには、観察したいオブジェクトを評価後に生じる(返値として持つ)式を選択した状態で、inspect itを意味するcmd+I(コマンドキーを押しながら“I”キー)をタイプします。たとえば、分数(クラスFractionのインスタンス、a Fraction)である(3/4)をインスペクトしたければ、それを生じさせるための式である、
3 / 4
をタイプして選択したのち、inspect it (cmd+I)します。inspect itは黄ボタンメニューにもあるので、マウスを手にしているときは、黄ボタンクリック(ワンボタンマウスならoption-クリック、2ボタンなら右クリック、ホイールボタンを含めた3ボタンなら中ボタンクリック)でポップアップするメニューから選択するのもよいでしょう。
[fig.A]黄ボタンメニューのinspect it
インスペクトしたいオブジェクトに対してinspectというメッセージを送って
も同じことができます。つまり、
(3/4) inspect
をdo it (cmd+D)してもよい、ということです。インスペクタは少々小振りな
ウインドウの姿で画面の適当な場所に現われます。
[fig.B]クラスFractionのインスタンス(3/4)のインスペクタ
インスペクタは呼び出された直後から、インスペクトしているオブジェクトに関するいくつかの情報を我々に呈示してくれています。タイトルバーにはオブジェクトが属しているクラス名を、左上のペインにはself、all inst varsという全オブジェクトに共通の項目に続いて、インスタンス変数の一覧を表示しています。(3/4)はFractionクラスに属し、numerator(分子)、denominator(分母)という2つのインスタンス変数を持っている…といった具合です。
続いて、左上のペインの項目をクリックしてそのときのインスペクタの動きを確認しましょう。選択と同時に(all inst varsを除き)、指定したそれぞれの変数や擬変数(self【註】)に束縛されているオブジェクトを右側のペインに呼び出すことができるはずです。all inst vars項目だけはちょっと変わっていて、全インスタンス変数とそれに束縛されているオブジェクトの一覧になります。
[fig.C](3/4)のインスペクタで、左ペインの各項目を選択したときの様子
なお、下のペインには特に機能は割り振られていません。書き捨てのメモ帳として利用します。ただ、インスペクト中のオブジェクトと名前空間を共有しているので、selfで自身を参照したり、インスタンス変数を直接使った式を書いて評価することが可能です。
self * denominator = numerator "=> true"
[fig.D]下のペインではselfやインスタンス変数を直接使用した式を評価できる
インスペクタは、インスタンス変数にどんなオブジェクトが束縛されているかを観察するだけでなく、束縛するオブジェクトを変えてしまうことも可能です。次回は、インスペクタとブラウザを使って、Smalltalkオブジェクトの動的側面を観察してみましょう。
【註】Smalltalkでは、束縛されているオブジェクトを参照することはできても、代入(すなわち、任意のオブジェクトを束縛しなおすことが)できない変数を“擬変数”と呼びます。self、super、thisContext、nil、true、falseの6つがこれに当たります。前三者は、用いられる文脈によって参照できるオブジェクトは変化します。後三者はそれぞれ、UndefinedObject、True、Falseの唯一のインスタンスを常に束縛しています。
このページを編集 (3869 bytes)
|
以下の 1 ページから参照されています。 |
This page has been visited 1203 times.