第47回
■
■SqueakではじめるSmalltalk入門 第47回
■
本連載では、名前は知っていてもなかなか触れる機会のないSmalltalkについて、最近話題のSqueakシステムを使って紹介しています。今回は、ファイルリストの文字化けをフィックスする作業を完了し、新しいメソッドの定義を他の仮想イメージでも利用できるようにするためのファイル出力の方法に触れます。
▼文字化け解消を.txtに限って機能するようにする
前回、FileList >> #defaultEncoderFor:でa Latin1TextConverterに設定されていたコンバータをa ShiftJISTextConverterに変更することで、文字化けを解消できることがわかりました。ただ、このままではファイルリストでの文字コードコンバータがa Latin1TextConverterであることを想定している機構があった場合に、ちょっと困ったことになりますね。そこで、今回の改変による影響を最小限にとどめるために、拡張子が.txtのファイルに限ってa ShiftJISTextConverterを使うようにしておきましょう。
このメソッドのコードをよく見ると、冒頭でテンポラリ変数「l」にファイル名を束縛しています。
| l |
l _ aFileName asLowercase.
文字列の最後の文字が'.txt'であるかどうかをチェックするために送るメッセージは「endsWith: '.txt'」です。 したがって、lに束縛されたファイル名を示す文字列の最後が'.txt'ならa ShiftJISTextConverterを返す式を追加すれば目的は簡単に達成できそうです。そのための式は次のようになります。
(l endsWith: '.txt') ifTrue: [^ ShiftJISTextConverter new].
「endsWith: ...」を「ifTrue: [...]」に優先して送信しなければならないので、括弧が必要です。この括弧がないと、「endsWith: ... ifTrue:[...]」というひとつながりのメッセージと解釈されてしまいますので注意してください。また、生成したコンバータ(a ShiftJISTextConverter)をこのメソッドの返値として返すために「^」が必要です。まだ式が続くので、行末のピリオドも忘れないように。
この式を途中に挿入し、あとは前回、ShiftJISTextConverterに変えてしまった最後のデフォルトのコンバータクラスをLatin1TextConverterに戻せば完成です。
[fig.A]加筆、修正後のFileList >> #defaultEncoderFor:メソッド
これで日本語ファイルの文字化けを解消する細工はOK。以後、ファイルリストで呼び出すシフトJISエンコードの.txtファイルは文字化けせずに表示されるようになります。デスクトップメニューから「保存」を選んで使用中の仮想イメージを上書きすれば再起動後もこの修正は機能し続けます。
▼修正したメソッドの定義をファイル出力する
この改変を他の仮想イメージにも適用したい場合、いったん当該メソッドの定義をSmalltalkシステムの外へ持ち出さなければいけません。このようなときは、メソッドのソースをファイルとして出力し、別の仮想イメージ内でそれを読込む作業を行ないます。Smalltalkでは、システム内のリソース(主にソースコード)のファイル出力のことをファイルアウト(file out)、リソース(主にソースコード)のファイルからの読み込みのことをファイルイン(file in)と言います。
言うまでもなく、メソッドのソースのファイルアウトもメッセージ送信で指示できます。
FileList fileOutMethod: #defaultEncoderFor:
が、こうした式をいちいちタイプしたり、do itするのも面倒な話ですよね。当然、ブラウザには同等の操作を行なうGUIが用意されているので、普段はこちらを使います。今、FileList >> #defaultEncoderFor:の編集に使っている変形ブラウザの上のペイン(通常のブラウザなら上段右端のペインに相当)の黄ボタンメニューからfileOutを選んでください。
[fig.B]FileList >> #defaultEncoderFor:メソッドのソースをファイルアウト
すると、FileList-defaultEncoderFor.stという名前のテキストファイルが使用中の仮想イメージと同じフォルダに作成されます。このファイルの中身はメソッドの定義とほぼ同じ内容です。“ほぼ”なのは、このファイルに含まれるコードがどんな素性のものかを示すメタ情報が追加され含まれているからです。具体的には、冒頭に仮想イメージのバージョンやファイルアウトされた日時が、また、メソッドの定義の直前には、クラス名、カテゴリ名、オーサー名とタイムスタンプが付記されます。なお多数挿入されている「!」は、これらメタ情報の区切りを示します。
別の仮想イメージで、このファイルをファイルインすれば、機能の追加が可能です。次回は、いくつかあるファイルインの方法と、関連した便利なツールを紹介します。
このページを編集 (3906 bytes)
|
以下の 1 ページから参照されています。 |
This page has been visited 805 times.