在Smalltalk中,如果x是一个数组,并且x at:3 put:123将起作用,那么(x at:3)+ 1如何工作?

时间:2015-12-17 15:09:28

标签: smalltalk gnu-smalltalk

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

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

只有在x at: 3返回时才能正常工作"单元格"对象,所以单元格可以接收一个Interger对象,即123.(或者,以便单元格对象可以让某些myContent属性指向123对象)

那么在这种情况下,怎么可以

y := (x at: 3) + 567

工作?因为单元格如何处理+消息?是不是以某种方式,单元格对象认为它不知道如何处理+消息,因此它会查看其内容(可能是self myContent之类的内容)然后返回它?它是如何工作的?我想知道是否有一个设计模式名称。

3 个答案:

答案 0 :(得分:6)

x at: 3 put: 123at:put:选择器发送到x

选择器有明确的优先级

  1. 一元(1 negated
  2. 二进制(1 + 2
  3. keyword(at:put:
  4. 关键字选择器的“参数”数量不相关,它将始终被解释为单个关键字选择器,因此detect:ifFound:ifNone:将被解释为发送到对象而不是三个单独的选择器选择器。

    现在,如果你想改变优先级,或者将一个关键字选择器放在另一个关键字选择器中,你必须将它包含在parens中。

    因此,您的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

答案 1 :(得分:5)

没有“细胞”对象。 x at: 3 put: 123将整数123放入索引x的集合3x(Collection,可能是一些更具体的类型,如Array)负责存储对象并在提供适当的索引时检索它,但它不会创建和存储不同的对象。从x的用户的角度来看,集合x的内部工作方式是不透明的 - 您不知道 x如何存储整数问题 - 您只知道当您将带有参数at:的消息3发送到x时,您将会收回之前存储的内容 - 即您将返回{ {1}}。因此,没有必须解释123的“单元格”对象 - 整数+正在处理123消息。

很有可能创建解释发送给它们的任意消息的类。在Smalltalk(例如Dolphin,Visual Smalltalk)的版本中,我通过实现“特殊”消息+完成了这项工作。

希望这有帮助。

答案 2 :(得分:1)

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