vieweditattachhistorytopchangessearchhelp

第40回


■SqueakではじめるSmalltalk入門   第40回


 本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今回は、つい先頃、メジャーバージョンアップしてリリースされた日本語版Squeak「SqueakNihongo7」のSmalltalk言語における日本語文字列の扱いをみてみます。

 じつのところ、SqueakNihongo7で日本語の文字列を扱うにあたり、すでにお馴染みの文字列オブジェクト(Stringのインスタンス。a String)との違いをユーザーが意識する必要はほとんどありません。これまでと同じようにシングルクオーテーションで括って新しい文字列を作り、これまでと変わらない方法でメッセージを送ることができます。

'日本語の文字列' size      " => 7 "
'日本語の文字列' reverse   " => '列字文の語本日' "


 文字列オブジェクトの要素である文字オブジェクトについても同じです。リテラル表現には、今まで通り、文字の前に「$」を付けます。

'日本語の文字列' at: 3            " => $語 "
'日本語の文字列' at: 3 put: $文   " => '日本文の文字列' "


 しかし、日本語の文字列および文字オブジェクトが属するのは、それぞれStringやCharacterとは別の新しく設けられたクラスです。これは、メッセージ「class」を送信すれば簡単に調べられます。

'single byte' class = 'single byte, too' class   " => true "
'single byte' class = 'マルチバイト' class       " => false "


'This is a pen.' class   " => String "
'日本語の文字列' class   " => MultiString"
$a class                 " => Character "
$あ class                " => MultiCharacter "


 日本語を含めたマルチバイト文字列を扱えるようにするためのクラスを追加するにあたって、文字列クラスが属するコレクションクラス群の構成にも若干手が加えられています。すでに解説を加えたとおり、公式版 3.7 では、

Collection
 SequenceableCollection
  ArrayedCollection
   String
    Symbol


というように、StringやSymbolは抽象クラスのArrayedCollection直下のサブクラスでしたが、SqueakNihongo7の仮想イメージでは、

Collection
 SequenceableCollection
  ArrayedCollection
   AbstractString  ←
    String
     Symbol
    MultiString  ←
     MultiSymbol ←


というように、新しくAbstractStringという文字列を束ねる抽象クラスが設けられ、改めてそのサブクラスとしてStringやSymbol、そして新しいMultiString、MultiSymbolが定義されています。

 a Stringがa Characterのみを要素とすることができる特殊なan ArrayedCollectionであるのに対し、a MultiStringはa Characterの他に、a MultiCharacterを要素に含めることができる文字列として定義されています。なお、a MultiCharacterにはUnicodeに独自の情報を付加した内部表現が用いられています。

$a asciiValue radix: 16    " => '16r61' "
$あ asciiValue radix: 16   " => '16r1403042' "


 AbstractStringは、シングルバイト文字列、マルチバイト文字列の双方で共通して使用できるメソッドを収めるために設けられました。つまりこのことは、これまでStringだけに定義されていたメソッドが、AbstractStringとString(あるいはMultiString)に分割して定義されていることを意味します。従来、文字列オブジェクトに特徴的な挙動を調べたいときに、Stringだけのブラウズで済んだものが、SqueakNihongo7ではAbstractStringとString(あるいはMultiString)を同時に調べなければならなくなっている点に注意する必要があるでしょう。

 ところで、通常のブラウザでブラウズできるのは、指定したクラスに定義されたメソッドのみです。StringとそのスーパークラスのAbstractStringの両方に定義されたメソッドを一挙にブラウズするようなことはできません。こうした用途には「プロトコルブラウザ」というものが用意されているのでこれを通常のブラウザの代わりに使用します。プロトコルブラウザは、デスクトップメニューの「開く…」(英語版ではopen...)からではなく、ブラウザのクラスペインの黄ボタンメニューにある「browse protocol」を選択して起動します。

[fig.A]Stringを選択したブラウザで「browse protocol」を選択
Uploaded Image: 40a.png

[fig.B]起動直後のプロトコルブラウザ
Uploaded Image: 40b.png

 起動直後の初期状態では、Objectクラスからのスーパークラス群に定義された全メソッドを表示してしまっています。これでは情報量が多すぎるので、ウインドウ中央左寄りにある「Only through Object」ボタンをクリックして、ポップアップするメニューから一挙にブラウズしたいスーパークラス(たとえばAbstractString)の範囲を指定します。この操作で、表示するメソッドを限定することが可能です。

[fig.C]スーパークラスの範囲を指定するためのポップアップ
Uploaded Image: 40c.png

 あとは、普通のブラウザと同じように扱えます。少し違うのは、メソッドのリストにメソッド名に加え、それが定義されているクラス名も括弧でくくって表示されていることです。なお、注目するクラス(この場合、String)に定義されたメソッドはリスト中太字で示されます。

[fig.D]プロトコルブラウザでのメソッドのブラウズ
Uploaded Image: 40d.png

 プロトコルブラウザはクラスの定義を行なう作業には向きませんが、注目するクラスのインスタンスが起動することが可能なメソッドを調べたいときなどにはたいへん重宝するツールです。ぜひ覚えて大いに活用してください。

このページを編集 (4739 bytes)


Congratulations! 以下の 1 ページから参照されています。

This page has been visited 928 times.