March 13, 2005

自由自在 Squeak プログラミング:第5章 基本クラスライブラリ探検─その1

Squeak Logo
<ブロック>:ブロックは「BlockContext」クラスから作られるオブジェクトで、単なる記号ではない。
・[ ]と書くだけでインスタンスが作成される。[ ] value と「value」メッセージを送るとブロック内の文が実行される。(valueメッセージが送られるまでブロック内は実行されない。)
例:valueTest := [1 + 2]. Transcript cr; show: valueTest value. 選んで"do it"すると、Transcriptに3が表示される。
・引数付きブロックは、[:引数| ]と書く。[ :引数| 引数] value: 'xxx' とvalue: メッセージで引数に値を渡せる。
例:[:arg | arg + 1] value: 1. を"inspect it"すると、SmallInteger:2が返って来る。
※:Squeakでは「value: value: value: value:」と4つの引数まで用意されている。それ以上の引数の場合は配列を渡すメッセージが用意されている。
例:[:arg1 :arg2 | arg1 + arg2] value: 1 value: 2. を"inspect it"すると、SmallInteger:3が返って来る。
・ブロック内リターン [↑ ] は、ブロックの中で「↑(^キャレットで入力する)」を書くと、どんなにブロックがネスト(入れ子)されていても、そこで処理を終了してブロックから外に抜け出す。(ブロックを一つだけ抜け出す処理はSqueakには無い。)

<日付と時間>:
Dateクラス:日付を表すクラス。標準の書式は DDMMYYYY(日月年) newではなく、Date today などを使用する。
Timeクラス:時間を表すクラス。標準の書式は hour:minute:second am/pm (時:分:秒 午前/午後)。 newではなく、Time now などを使用する。

<コレクションクラス群>:コレクションクラス群のルートは Collection(抽象)クラス
順序無しコレクション:Bag, Set
・Bag:中身にどんなオブジェクトでも入れられる。順序は無関係で、重複もOK。
・Set:Bagと同じでどんなオブジェクトでも入れられるが、重複は不可。
順序付きコレクション:Array, OrderedCollection, SortedCollection
・Array:順序付きで、作成時のサイズが固定のコレクション。個々の要素は変更できるが、要素数を追加/削除できない。リテラル #(要素1 要素2 …) で作成可能。
・OrderedCollection:順序付きでサイズ可変のコレクション。 newでサイズなしを作成して、add: や addFirst:で要素を追加可能。
・SortedCollection:要素の並べ替えを自動的に行うコレクション。 標準のソート順は <= での比較。 sortBlock: [:a :b | a > b]などでソート方法を指定してSortedCollectionのインスタンスを生成できる。
キー付きコレクション:Dictionary, IdentDictionary
・Dictionary:辞書の様に、「キー」と「値」のペアで情報を保持する(順序は保証されない)。Dictionaryは = で「キー」を比較するため、キーには数字や文字列など、= で比較できるものを使用する。
・IdentDictionary:IdentDictionary は、== で「キー」を比較する。 == でオブジェクト(VM内のポインタ)を比較する為、検索は高速だが、キーとして文字列が使い難くなる。(#でシンボルにするなど、工夫が必要。)

コレクションの変換:Collectionクラスのインスタンスメソッドカテゴリ「converting」内に「as<クラス名>」で幾つか変換用メソッドが定義されている。「コレクションクラスのインスタンス as<クラス名>」で、値がコピー・変換され、<クラス名>型の新たなインスタンスが返って来る。

yourself:コレクションクラスのインスタンスメソッド(add:, at:put: など)の多くは、その戻り値がレシーバ(コレクションクラスのインスタンス)では無く、インスタンスメソッド(add:, at:put: など)の引数になっている為、yourself メッセージを(カスケード ; の最後に)送信する事で、明示的にレシーバ自身を返したい時に使用する。
例:
yourselfが無い時:(Bag new) add: 1; add: 2; add: 3.:"inspect it"すると、add: 3の引数 3 が返り、望んだ結果にならない。
yourselfが有る時:(Bag new) add: 1; add: 2; add: 3; yourself.:"inspect it"すると、 a Bag(1 2 3) と望んだものになる。

イテレート(繰り返し)プロトコル:コレクションクラス群の要素を、繰り返し取り出すメソッド。(意味の似通った手続き群をプロトコルと呼ぶ)
・do:<コレクション> do: [:each | <処理>]:コレクションから連続して要素を取り出し、ブロック内の処理を行う。
・select:<コレクション> select: [:each | <比較式>]:コレクションから取り出した要素をブロック内の式で比較し、trueの要素を取り出す。
・reject:selectとは逆に、ブロック内の式で比較した結果が、falseの要素を取り出す。
・detect:ブロック内の式で比較し、最初にtrueになった要素のみを返して、そこで処理を終了する。trueの要素が無ければエラー(error: 'Object is not in the collection.')を返す。 見つからなかった時に処理をさせるには、detect:ifNone: を使う。
・collect:<コレクション> collect: [:each | <加工処理>]:コレクションの各要素に対して加工処理を行う。
・inject:into:<コレクション> inject:<初期オブジェクト> [:obj :each | <処理>]:ブロック内引数 obj にまず初期オブジェクトが入り、eachにコレクションの最初のオブジェクトが入り、処理を行う。次に、処理の結果が obj に入り、コレクションの次の要素がeachに入り、処理を行う…の繰り返しで、コレクションの要素が無くなるまで処理が続く。
・keysDo:<ディクショナリ> keysDo: [:each | <処理>]:Dictionary系コレクションで「キー」を取り出して処理する。
・valuesDo:<ディクショナリ> valuesDo: [:each | <処理>]:ディクショナリから、「値」を取り出して処理する。
・keysAndValuesDo:<ディクショナリ> keysAndValuesDo: [:key :value | <処理>]:ディクショナリから「キー」と「値」をそれぞれ取り出して処理する。
・associationsDo:<ディクショナリ> associationsDo: [:associations | <処理>]:Associationは「キー」と「値」のペアで、「キー -&gt; 値」と【-&gt; 】メッセージで作成できる。 作成されたインスタンスから「キー」を取り出すには「key」メソッドを、「値」を取り出すには「value」メソッドを送る。


Posted by 3k1 at 04:47 P | from category: Squeak | TrackBacks
Comments
No comments yet
:

:

Trackbacks