当前位置:  开发笔记 > IOS > 正文

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

如何解决《在Smalltalk中,如果x是一个数组,并且xat:3put:123将起作用,那么(xat:3)+1如何工作?》经验,为你挑选了2个好方法。

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

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



1> Peter Uhnak..:

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

选择器有明确的优先级

    一元(1 negated)

    二进制(1 + 2)

    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.


@太极者无极而生是,Objective-C的灵感来自Smalltalk.

2> Bob Jarvis -..:

没有"细胞"对象.x at: 3 put: 123将Integer 123放入x索引的Collection 中3.x(Collection,可能是一些更具体的类型,如Array)负责存储对象并在提供适当的索引时检索它,但它不会创建和存储不同的对象.集合的内部工作x是从视图的用户的角度不透明x-你不知道如何 x被存储有关的整数-你只知道,当你发送邮件at:与参数3x你要回来之前存储的内容 - 即你会回来的123.所以没有必须解释的"单元"对象+- 整数123是处理+消息的东西.

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

希望这可以帮助.

推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有