3

也就是说,如果我们将其视为所有对象和消息,那么

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

只有当x at: 3像“单元格”对象一样返回时才能工作,因此单元格可以接受一个I​​nterger对象,即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:将被解释为发送到对象的单个选择器而不是三个单独的选择器。

现在,如果您想更改优先级,或者将一个关键字选择器放在另一个关键字选择器中,您必须将其括在括号中。

所以你x at: 3 put: 123只包含一条消息:at:put:; 如果你真的想发送put:到当前位置的值3,你需要把它放在parens(x at: 3) put: 123中,这也和你的观察一致(x at: 3) + 567

其他语言的等效语法是x.atPositionInsert(3, 123), 和x.atPosition(3) + 567.

于 2015-12-17T16:05:34.277 回答
6

没有“细胞”对象。x at: 3 put: 123将 Integer123放入 Collectionx的 index 3x(集合,可能是一些更具体的类型,例如数组)负责存储对象并在提供适当索引时检索它,但它不会创建和存储不同的对象。x从用户的角度来看,集合的内部工作是不透明的x——你不知道如何 x存储有问题的整数——你只知道当你发送at:带有参数3的消息时x你会回来之前存储在那里的东西——也就是说,你会回来123的。所以没有“细胞”+- 整数123是处理+消息的对象。

很有可能创建解释发送给它们的任意消息的类。在 Smalltalk 的版本(例如 Dolphin、Visual Smalltalk)中,我使用的是通过实现 'special' message 来完成的doesNotUnderstand:

希望这可以帮助。

于 2015-12-17T15:43:56.393 回答
1

我可能会在彼得的回答中补充一点,括号就像其他语言中的括号一样,它强制首先评估括号中的表达式。如果有多个括号,则评估从左到右进行。所以 y := (x at: 3) + 567 For (x at: 3) 首先被评估,得到 123。123 + 567 第二被评估,得到 690,y 设置为 690。

于 2015-12-18T08:19:23.637 回答