March 27, 2005

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

Squeak Logo
<ストリームクラス群>:ストリームは一続きのデータを処理するもので、必ずなんらかのコレクション(クラスのインスタンス)を元に生成するが、殆どの場合は String を扱う時に利用される。

基本(内部)ストリーム:メモリ上のみに存在するストリーム
ReadStream:読み込み専用のストリーム。「on:」クラスメソッドの引数にコレクションクラス(Array, String クラスなど)のインスタンスを渡して生成できる。
 例:rs := ReadStream on: #(a b c d). rs inspect. "do it"
または、コレクションクラス(Array, String クラスなど)のインスタンスに、「readStream」メッセージを送る事でも、生成できる。
 例:rs := #(a b c d) readStream. "inspect it" rs := 'abcd' readStream. "inspect it"
next, next: メッセージ:ストリームに「next」メソッドを送る事で、要素を順に取り出せる。「next:」メッセージで引数分だけ取り出す事もできる。
※:コレクションの最後の要素を超えると「nil(不定)」が返って来る。
 例:rs := '12345' readStream. rs next. "print it" rs next: 4. "print it" rs next. "print it"
定番の書き方:「whileFalse:」メソッドを使い、ストリームに「atEnd」メソッドを送って判定する。
 例:rs := 'Hello Squeak!' readStream. [rs atEnd] whileFalse: [Transcript space; show: rs next]. "do it"
upToEnd メッセージ:next 等で読み込み後、最後まで全て取り出す時に使用する。
 例:rs := 'Hello Squeak!' readStream. rs next:6. rs upToEnd. "print it"
contents メッセージ:next 等で読み込んだ位置に関係なく、最初から最後まで全て取り出す時に使用する。
 例:rs := 'Hello Squeak!' readStream. rs next:6. rs contents. "print it"
position, position: , resetメッセージ:現在の読み取り位置をpositionで確認、positon: で読み取り位置を先頭からの絶対値で設定する事ができる。position: の引数がストリームの要素を超える場合はエラー。 resetでpositionの値をゼロに戻せる。
 例:rs := 'Hello Squeak!' readStream. rs next:6. rs position. "print it" rs position:12. rs next. "print it" rs reset. rs position. "print it"
skip: メッセージ:現在の読み取り位置から相対的に読み取り位置を指定できる。負の値で戻る事もできる。ストリームの要素数を超えたり、ゼロ以下になるとエラー。
 例:rs := 'Hello Squeak!' readStream. rs next:6. rs skip:6. rs next. "print it" rs skip:-6. rs next. "print it"
upTo: メッセージ:引数の要素までを取り出す。positionの値は、一致した要素になる。引数と一致する要素が無ければ最後まで取り出す。
 例:rs := 'Hello Squeak!' readStream. rs upTo:(Character space). "print it" rs upTo:(Character space). "print it"
skipTo: メッセージ:引数の要素までpositionを移動するだけ。upToの様に、要素を返さない。
 例:rs := 'Hello Squeak!' readStream. rs skipTo:(Character space). rs position. "print it"
peek メッセージ:nextメッセージと同じく、次の要素を取り出すが、positionを変化させない。
 例:rs := 'Hello Squeak!' readStream. rs next. rs position. "print it" rs peek. "print it" rs position. "print it"

WriteStream:書き込み専用のストリーム。
on: メッセージ:on: クラスメソッドの引数に、書き込むおおよその要素数を持ったコレクションクラスのインスタンスを指定して、ストリームを作成する。
最初に指定した要素数を超える要素を書き込んだ場合でも、自動で拡張されるので要素数ゼロでも構わないが、拡張作業が必要な為、その分動作が遅くなる。
 例:要素数ゼロで作成:WriteStream on: ''. "inspect it"
 例:要素数を指定して作成:WriteStream on: (Array new:10). "inspect it"
with: メッセージ:on: メッセージと同じく、引数に渡したコレクションでストリームを作成するが、on: ではストリームに要素を追加すると上書きされるのに対し、with: で作成したストリームは最初に渡したコレクションを保持して、その後ろに要素が追加される。
 on: の例:WriteStream on: (Array new:5). "inspect it"
 with: の例:WriteStream on: (Array new:5). "inspect it"
on: と with: で作成したストリームでは、要素が追加される位置を示す position の値が違っている事が分かる。また、on: に渡した引数が意味の有るコレクションでも、取り出す事ができない様になっている(上書きされてしまうから?)。
 on: の例:(WriteStream on: 'Hello Squeak') contents. "print it"
 with: の例:(WriteStream on: 'Hello Squeak') contents. "print it"
nextPut: メッセージ:引数に要素を一つ指定して、ストリームに追加する事ができる。
 例:ws := WriteStream on: ''. ws nextPut: $a. ws nextPut: Character space. ws nextPut: $A. ws contents. "print it"
nextPutAll: メッセージ:引数にコレクション(のインスタンス)を指定して、ストリームに追加する事ができる。
 例:ws := WriteStream on: ''. ws nextPutAll: 'Hello'. ws nextPut: Character space. ws nextPutAll: 'Squeak!'. ws contents. "print it"


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

:

Trackbacks