[英]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 negated
) 1 + 2
) 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:
用争论3
至x
你要回到之前存储的东西 - 也就是说你会回来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.