4

我正在尝试通过 Dolphin Smalltalk X6 附带的教程来学习 Smalltalk。

我的问题涉及对具有多条消息的表达式的评估。

我的理解是首先评估简单消息,然后是二进制消息,最后是关键字消息(括号中的代码除外)。但是,我无法将此理解应用于以下示例中的第二行(在Dolphin Smalltalk 教程中找到)。

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

如果我的理解是正确的,那么将评估第二行:

    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”是如何指代匿名 Triangle 对象而不是“playground”所指的 Playground 对象。

我查找了 Smalltalk 评估的第二种解释,提到了 := 或添加:是没有成功的特殊情况,而我能想到的唯一其他解释是一个基本的误解。

任何帮助理顺我?

4

2 回答 2

8

赋值运算符 (:=) 不是消息。(它不会发送到对象,而是表示应将变量设置为值)。它的优先级是最后一个整体。

所以会发生什么:

  1. 简单消息“新”发送到三角形,三角形对象作为响应
  2. 关键字 message add: 发送到游乐场,并且有一个约定 add: messages 回答添加的对象,这似乎遵循,因此返回新创建的三角形。
  3. 变量 teresa 设置为新三角形
  4. 特蕾莎班。“评估为三角形”。
于 2013-03-07T01:23:05.417 回答
7

虽然 := 看起来像二进制消息,因为它使用中缀字符......它不是。它是语言语法的一部分,就像括号和句点一样(例如)。

将 := 视为赋值运算符(有时称为“gets”)。这不是任何优先级的消息。它在任何消息发送后进行评估。它的左值必须是直接变量引用(不是消息发送的结果)。

于 2013-03-07T01:24:54.453 回答