2013-03-06 33 views
4

我正在尝试通过Dolphin Smalltalk X6附带的教程学习Smalltalk。“:=”和Smalltalk中的二进制消息优先级

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

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

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'". 

我的误解是如何“邓丽君”来指代匿名三角对象,而不是游乐场对象简称到'游乐场'。

我已经查阅了关于Smalltalk评估的第二个解释,提及:=或添加:是没有成功的特殊情况,我能想到的唯一的其他解释是一个根本性的误解。

任何帮助矫直我?

回答

7

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

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

8

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

那么什么情况是:

  1. 简单的消息“新的”发送到三角,三角形对象作为响应
  2. 关键字信息加:发送到操场上,有这么添加约定:消息接听对象添加,这似乎跟随,所以新创建的三角形返回。
  3. 将变量teresa设置为新的三角形
  4. teresa类。 “评估为三角形”。
+0

让人想知道为什么:=不是Smalltalk中的消息。为什么不让变量接收:=? – Hendekagon 2013-03-11 05:50:11

+1

因为变量实际上是指向对象的指针,所以它不是对象本身。消息发送给变量指向的对象,而:=运算符则更改变量指向的对象。 – 2013-03-12 22:55:02

+0

hmm对象指针不是对象,所以它们不能接收:=(或pointTo:anObject或→) – Hendekagon 2013-04-18 00:20:37