4

Dolphin Smalltalk X6 に含まれているチュートリアルを通じて Smalltalk を学習しようとしています。

私の質問は、複数のメッセージを持つ式の評価を扱います。

私の理解では、単純なメッセージが最初に評価され、次にバイナリ メッセージが評価され、最後にキーワード メッセージが評価されます (括弧内のコードを除く)。ただし、この理解を次の例の 2 行目に適用するのに問題があります ( Dolphin Smalltalk チュートリアルにあります)。

    playground := Playground new.
    teresa := playground add: Triangle new.       "Misunderstood code"
    teresa class.                                 "Evaluates to 'Triangle'"

私の理解が正しければ、2 行目は次のように評価されます。

    1. Simple message 'new' sent to Triangle, triangle object as response
    2. Binary message ':=' with parameter 'playground' sent to 'teresa'.
    3. Keyword message 'add:' with parameter 'triangle object' sent to 'teresa'.
    4. teresa class. "evaluates to 'Playground'".

私の誤解は、「teresa」が「playground」によって参照される Playground オブジェクトではなく、匿名の Triangle オブジェクトを参照するようになったことにあります。

:= または add: が成功しない特殊なケースであるという言及に対する Smalltalk 評価の 2 番目の説明を調べましたが、私が考えることができる唯一の他の説明は根本的な誤解です。

私をまっすぐにする助けはありますか?

4

2 に答える 2

8

代入演算子 (:=) はメッセージではありません。(オブジェクトに送信されるのではなく、変数に値を設定する必要があることを示します)。その優先順位は全体的に最後です。

したがって、何が起こるかは次のとおりです。

  1. シンプルなメッセージ 'new' が Triangle に送信され、三角形オブジェクトが応答として送信されます
  2. キーワード メッセージ add: がプレイグラウンドに送信され、add: メッセージが追加されたオブジェクトに応答するという規則があり、このメッセージはそれに従っているように見えるため、新しく作成された三角形が返されます。
  3. 変数 teresa が新しい三角形に設定されます
  4. テレサクラス。「三角形に評価する」。
于 2013-03-07T01:23:05.417 に答える
7

:= は中置文字を使用しているためバイナリ メッセージのように見えますが、そうではありません。これは、括弧やピリオドと同じように言語構文の一部です (たとえば)。

:= を代入演算子と考えてください (「gets」と呼ばれることもあります)。これは優先順位のないメッセージです。メッセージの送信後に評価されます。その左辺値は直接の変数参照でなければなりません (メッセージ送信の結果ではありません)。

于 2013-03-07T01:24:54.453 に答える