在使用Array
GNU Smalltalk 中的类时,我很惊讶#at:put:
消息属于类SmallInteger
而不是类Array
(或任何其他超类Array
)。为什么?
问问题
413 次
1 回答
4
#at:put:
在 上定义Object
。SmallInteger
确实重新定义它以引发异常,因为它不可索引并且任何子类同时也不可索引。
这也有点棘手。
长解释:
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 回答