0

在使用ArrayGNU Smalltalk 中的类时,我很惊讶#at:put:消息属于类SmallInteger而不是类Array(或任何其他超类Array)。为什么?

4

1 回答 1

4

#at:put:在 上定义ObjectSmallInteger确实重新定义它以引发异常,因为它不可索引并且任何子类同时也不可索引。

这也有点棘手。

长解释:

1)SmallInteger只是在VM中转换为整数。实际上是在VMSmallInteger a中翻译成。(a bitShift: 1) bitOr: 1

2)#at:put:是检查类是否可索引的原语。可索引对象是可以发送的对象#at:put:#at:并且必须通过#new:. 这是拥有变量实例的方法,也是唯一的方法。(Tangent:OrderedCollection在 other 中实例化几个可索引对象,让您#add:多次调用并感觉长度是无限的)。

3)知道如果#at:put:没有在SmallIntager类中重新定义,原语必须首先检查对象是否是SmallInteger然后检查它是否可索引。这会给您带来一些性能损失。并重新定义#at:put:onSmallInteger只需删除SmallInteger检查。

于 2011-06-15T14:50:41.793 回答