在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。我在回答中确实提到了这一点,除非我在你的回答中遗漏了一些额外的东西。