1

キーワード メッセージ スタイル メソッドを作成しようとしていますが、メソッド内から Receiver にアクセスする方法がわかりません。これは簡単だと思いますが、どこにも答えが見つかりません。私が実装しようとしているのは冗長ですが、それがどのように機能するかを知りたいです。

subst: i1 by: i2
      ^ self copyReplaceAll: i1 with: i2.

ワークスペースでは次のように呼び出されます。

string1 := 'Lemon'.
string2 := 'm'.
string3 := 'ss'.
string1 subst: string2 by: string3.

エラー メッセージ: "MessageNotUnderstood: ByteString>>subst:by:"

メソッドが行う必要があるのは、「Lemon」内のすべての「m」を「ss」に置き換えて「Lesson」を作成することだけです (copyReplaceAll は既に行っています)。string1 をメソッドに入れる方法がわかりません。どんな助けでも大歓迎です、

前もって感謝します!

4

2 に答える 2

3

self現在のオブジェクト (つまり、レシーバー) です。

基本を理解するには、チュートリアルを読んで (または少なくともざっと目を通して)ください。


"MessageNotUnderstood: ByteString>>subst:by:"

このエラーは、ByteString でメッセージを定義していないことを意味します。実際にどこでも定義できなかったか、間違ったクラスで定義したかのいずれかです。

于 2012-03-22T18:57:37.560 に答える
0

Smalltalk では、メソッドは独立したものではありません。

メソッドは、メッセージ sendに応答するオブジェクトの方法です。

メッセージを受信するモノがメッセージに応答する方法を知っている場合、メッセージに応答する方法があります。メッセージ名は、オブジェクトのメッセージプロトコルにあると言われています。

つまり、すべてのメッセージには受信者メッセージ名があります。

キーワード メッセージには 1 つ以上の引数もあり引数ごとに 1 つのキーワードがあります。

これの裏返しは、すべてのメソッドが object の一部であることです。これらは、クラス メソッドまたはインスタンス メソッドのいずれかとして、オブジェクトのクラス定義内に格納されます。

(唯一の例外は、blocksと呼ばれる無名オブジェクトの特定のケースです。これらのケースでは、メソッドはblock definitionで定義されます)。

キーワード メッセージの例を次に示します。 Transcript show: 'Hello World!'

「メッセージshow: 'Hello World!'を受信者に送信する」ことを意味しますTranscript。(Transcript は、システム出力を表示するウィンドウです。すべてのグラフィカルな Smalltalk 環境には、Transcript クラスがあります)。

このメッセージには 3 つの部分があります。

一番左の部分は常にレシーバーです。この例では、受信者Transcriptです。

メッセージ名はshow:、単一のキーワードを持つものです。show:

引数は'Hello World'

(さらに詳しい説明はTranscript show: 'Hello World!'
[ http://beginningtosmalltalk.blogspot.com/2015/11/hello-world.html]にあります。

複数のキーワードを含むキーワード メッセージの例:

aByteString copyReplaceAll: i1 with: i2

レシーバーはaByteString、クラスのインスタンスですByteString

メッセージ名は、 とcopyReplaceAll:with:の 2 つのキーワードがcopyReplaceAll:ありwith:ます。

引数はi1i2です。

ByteStringクラス (または のようなクラス階層でそれより上の任意のクラス) にメソッドが含まれている場合String、メッセージはオブジェクトのプロトコルにあります。

string1 := 'Lemon' . string1 copyReplaceAll: i1 with: i2

必要に応じて、追加のメソッドとして、Stringまたはにコードを追加できます。ByteString

subst: i1 by: i2
"Substitute all instances of substring i1 with string i2. Return the receiver"
^ self copyReplaceAll: i1 with: i2

その後、次のようにワークスペースで呼び出すことができます。

string1 := 'Lemon'. string2 := 'm'. string3 := 'ss'. string1 subst: string2 by: string3

でもstring1 subst: string2 by: string3あまり変わらない
string1 copyReplaceAll: string2 with: string3

注目すべきもう 1 つのスタイル ポイントは、キーワード メッセージ内の各キーワードは、できるだけ説明的で明確なものにする必要があるということです。 substまたはsubstitute_substring

メソッドをクラスに追加する最も簡単な方法は、システム ブラウザを使用することです。システム ブラウザでクラスをクリックすると、プロフォーマ メソッド定義が編集ペインに表示されます。

上書きしてAccept itください (私のシステムでは、2 ボタンまたは 3 ボタンのマウスを右クリックするか、「Ctrl-s」キーボード ショートカットを使用します。ただし、マウスとキーのマッピングはプラットフォームによって異なる場合があります)。

于 2015-11-15T23:46:54.657 に答える