3

つまり、それをすべてのオブジェクトとメッセージとして見ると、

"Did this earlier:    x := Array new: 20"
x at: 3 put: 123      "this will put 123 into slot 3"

「セル」オブジェクトのように返される場合にのみ機能するx at: 3ため、セルは 123 である整数オブジェクトを取り込むことができます (または、セル オブジェクトが一部のmyContentプロパティを 123 オブジェクトにポイントできるようにするため) 。

次に、この場合、どのようにできますか

y := (x at: 3) + 567

仕事?+細胞はメッセージをどのように処理するのでしょうか? どういうわけか、セルオブジェクトがメッセージの処理方法がわからないと考えている+ので、その内容を調べて(おそらく のようなものでself myContent)、それを返しますか?それはどのように機能しますか?デザインパターンの名前もあるのかな。

4

3 に答える 3

7

x at: 3 put: 123at:put:セレクターを に送信しxます。

セレクターには明確に定義された優先順位があります

  1. 単項 ( 1 negated)
  2. バイナリ ( 1 + 2)
  3. キーワード ( at:put:)

キーワード セレクターの「引数」の数は関係ありません。常に単一のキーワード セレクターとしてdetect:ifFound:ifNone:解釈されるため、3 つの個別のセレクターではなく、オブジェクトに送信される単一のセレクターとして解釈されます。

優先度を変更したり、あるキーワード セレクターを別のキーワード セレクターの中に入れたりする場合は、括弧で囲む必要があります。

したがって、x at: 3 put: 123メッセージは 1 つだけ含まれますat:put:put:position に存在する値に実際に送信したい場合は、3それを括弧で囲む必要があります。(x at: 3) put: 123これは、 についての観察とも一致しています(x at: 3) + 567

他の言語の同等の構文はx.atPositionInsert(3, 123), andx.atPosition(3) + 567です。

于 2015-12-17T16:05:34.277 に答える
6

「セル」オブジェクトはありません。x at: 3 put: 123Integer123を Collectionxの indexに置きます3(配列などのより具体的な型の場合があるコレクション) は、オブジェクトを格納し、適切なインデックスが提供されたときにそれを取得する責任がありますが、別のxオブジェクトを作成して格納することはありません。Collection の内部動作は、ユーザーの観点からは不透明です- 問題の整数をどのように格納しているはわかりません-引数を指定してメッセージを送信すると、戻ってくることがわかります。以前そこに保存されていたもの - つまり、戻ってきます。だから「細胞」はありません。xx xat:3x123+- Integerはメッセージ123を処理しているものです。+

送信された任意のメッセージを解釈するクラスを作成することは非常に可能です。Smalltalk のバージョン (Dolphin、Visual Smalltalk など) では、これは「特別な」メッセージを実装することによって行われますdoesNotUnderstand:

お役に立てれば。

于 2015-12-17T15:43:56.393 に答える
1

括弧は他の言語の括弧のようなもので、括弧内の式が最初に評価されるように強制するというピーターの答えに追加するかもしれません。複数の括弧がある場合、評価は左から右に進みます。したがって、y := (x at: 3) + 567 For (x at: 3) が最初に評価され、123 が得られます。123 + 567 が 2 番目に評価され、690 が得られ、y が 690 に設定されます。

于 2015-12-18T08:19:23.637 に答える