繁体   English   中英

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

[英]In Smalltalk, if x is an array, and x at: 3 put: 123 will work, then how can (x at: 3) + 1 work?

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

"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类的东西)然后返回它? 它是如何工作的? 我想知道是否有一个设计模式名称。

x at: 3 put: 123发送at:put: selector到x

选择器有明确的优先级

  1. 一元( 1 negated
  2. 二进制( 1 + 2
  3. keyword( at:put:

关键字选择器的“参数”数量不相关,它将始终被解释为单个关键字选择器,因此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

没有“细胞”对象。 x at: 3 put: 123将Integer 123放入Collection x的索引3 x (Collection,可能是一些更具体的类型,如Array)负责存储对象并在提供适当的索引时检索它,但它不会创建和存储不同的对象。 集合的内部运作x是从视图的用户的角度不透明x -你不知道怎么 x的存储问题的整数-你只知道,当你发送消息at:用争论3x你要回到之前存储的东西 - 也就是说你会回来123 所以没有“单元”对象必须解释+ - 整数123是处理+消息的。

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

希望这可以帮助。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM