在Smalltalk中,如果x是一个数组,并且x at:3 put:123可以工作,那么(x at:3)和#x2B;1工作?
也就是说,如果我们将其视为所有对象和消息,那么在Smalltalk中,如果x是一个数组,并且x at:3 put:123可以工作,那么(x at:3)和#x2B;1工作?,smalltalk,gnu-smalltalk,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像“单元”对象一样返回时才能工作,因此单元可以接收整数对象,即123。(或者,这样单元格对象可以让一些myContent属性指向123对象) 那么在这种情况下,怎么可能呢? y := (x at: 3) + 567 工作?因为单元格如何处
"Did this earlier: x := Array new: 20"
x at: 3 put: 123 "this will put 123 into slot 3"
只有当x at:3
像“单元”对象一样返回时才能工作,因此单元可以接收整数对象,即123。(或者,这样单元格对象可以让一些myContent
属性指向123对象)
那么在这种情况下,怎么可能呢?
y := (x at: 3) + 567
工作?因为单元格如何处理+
消息?是因为cell对象不知何故认为它不知道如何处理+
消息,所以它会查看其内容(可能通过类似self myContent
的方式)然后返回它吗?它是如何工作的?我还想知道它是否有一个设计模式名称。没有“cell”对象x at:3 put:123
将整数123
放入索引3
处的集合x
x
(集合,可能是更具体的类型,如数组)负责存储对象并在提供适当索引时检索对象,但它不会创建和存储不同的对象。从x
用户的角度来看,集合x
的内部工作是不透明的-您不知道x
是如何存储所讨论的整数的-您只知道,当您将带有参数3
的消息发送到x
时,您将取回存储在那里的内容更早-即您将返回123
。因此没有“cell”对象必须解释+
——整数123
是处理+
消息的对象
创建解释发送给它们的任意消息的类是非常可能的。在Smalltalk的版本中(例如Dolphin、VisualSmalltalk),我通过实现“特殊”消息doesNotUnderstand:
来实现这一点
希望这有帮助。x at:3 put:123
将at:put:
选择器发送到x
选择器有明确的优先级
一元(1取反
)
二进制(1+2
)
关键字(at:put:
)
关键字选择器的“参数”数量不相关,它将始终被解释为单个关键字选择器,因此detect:iffind:ifNone:
将被解释为发送到对象的单个选择器,而不是三个单独的选择器
现在,如果您想更改优先级,或者将一个关键字选择器放在另一个关键字选择器中,则必须将其包含在paren中
因此,您的x at:3 put:123
只包含一条消息:at:put:
;如果确实要将put:
发送到位置3
处的值,则需要将其放入parens(x at:3)put:123
,这也与您对(x at:3)+567
的观察一致
其他语言的等效语法是x.atPositionInsert(3123)
,和x.atPosition(3)+567
我可能会补充Peter的回答,括号与其他语言中的parens类似,它强制首先计算parens中的表达式。如果有多个参数,则评估将从左向右进行。
所以
y:=(x在:3处)+567
对于(x at:3),首先计算得到123。123+567第二次计算得到690,y设置为690。有趣,因此“at:put:”和“at:”是两种不同的、独立的方法(或消息)。。。因此,它有点像objective-C,您可以使用[aView insertSubview:aSubView]
和[aView insertSubview:aSubView atIndex:i]
,它们是不同的方法@太極者無極而生 是的,Objective-C的灵感来自Smalltalk。我在回答中确实提到了这一点,除非我在你的回答中遗漏了一些额外的东西。