ObjectSquare [1999 年 1 月号]

[Happy Squeaking!!]


3.Squeak 演習:オブジェクトにメッセージを送る

3.2 様々な種類のメッセージ


Smalltalkではメッセージの種類を3種類に分割しています。


3.2.1 単項メッセージ

オブジェクトにメッセージを送る際に、送り手側で、なんらかのデータを受け取り側に渡してあげたいときがあります。
例えば「Aさんの銀行口座オブジェクトに、新たに3000円振り込みたい」という時に、3000円というデータを銀行口座オブジェクトに渡す必要があります。また、「#($a $b $c)という配列オブジェクトの2番目をとりだしたい」という時には、「2番目」ということを配列オブジェクトに知らせる必要があります。

今まで紹介してきたメッセージにはこうした送り手側のデータが含まれませんでした。

'Hello Smalltalk' size. "文字列に大きさを聞く"

こうした受け渡すデータ(引数)のない単純なメッセージをSmalltalkでは単項メッセージと呼びます。


3.2.2 2項メッセージ

2項メッセージは、受け渡すデータを一つだけ含みます。

!%&*=,/ó ?@\~| のどれかの記号を任意にえらんでメッセージ名とします。
これらの記号は、2項メッセージ専用として予約されています。

"3オブジェクトに+メッセージを送る、引数は1"
3 + 1.

"文字列オブジェクト'Hello'に連結を行う。引数は'Smalltalk"
'Hello', 'Smalltalk'.

通常、数字や文字列などの単純なオブジェクトに対するメッセージ送信で、2項メッセージは使われます。

それでは以下の実行結果はどうなるでしょうか。

3 + 5 * 4

これは、Smalltalkでは32 になります。
3 オブジェクトに + のメッセージが送られ、引数は5です。
結果として返るオブジェクトは 8、次に * メッセージが 引数 4で送られ、32というオブジェクトが返ってくることになります。

Smalltalkでは演算子といったものを特別扱いしません。あくまでオブジェクトに対してメッセージが順番に送られることになります。


3.2.3 キーワードメッセージ

キーワードメッセージには一つ以上のパラメータ(引数)が含まれます。
メッセージ名に: (コロン)が含まれるのが特徴です。
データはそのコロンの後に指定されます。

引数1つの場合
"Transcript にshow: メッセージを送る。引数は'HelloWorld"
Transcript show: 'HelloWorld'

"配列オブジェクト #($a $b $c)の2番目を取り出す"
#($a $b $c) at: 2

引数2つの場合
"文字列オブジェクト 'HelloSmalltalk' の2番目から5番目を取り出す"
'HelloSmalltalk' copyFrom: 2 to: 5.

引数3つの場合
"文字列オブジェクト 'HelloSmalltalk'の2番目から5番目を'appy'に変更する"
'HelloSmalltalk' copyReplaceFrom: 2 to: 5 with: 'appy'

以下4つ、5つと同じように続きます。
Cなどの言語では、引数が複数ある関数は、()で括りコンマで区切ることで指定を行います。
上記の例だとcopyReplace(2,5,'appy') などとなります。
Smalltalkの場合、引数の区切りを、コンマ記号でなく、キーワードとしてコロンが末尾についた任意の英字で書ける(この場合to:や with: )ので、非常にそれぞれの引数の意味をわかりやすくできます。

なお、キーワードメッセージは一続きでメッセージ名とみなされます。順番を入れ替えた場合は別のメッセージとなります。
anObject to: 3 from: 5と anObject from: 5 to: 3 は別ものです。片方がto:from:というメッセージ名で、後者がfrom:to:というメッセージ名になります。

SmallTip: メッセージには単項、2項、キーワードの3種類がある。

© 1999-2001 OGIS-RI Co., Ltd.

Prev.

Index

Next