在GNU Smalltalk中使用Array
类时,我很惊讶#at:put:
消息属于类SmallInteger
而不是类Array
(或任何类)其他超级Array
)。为什么呢?
答案 0 :(得分:4)
#at:put:
在Object
上定义。 SmallInteger
确实重新定义它以引发异常,因为它不是可索引的,也不是任何子类,同时也不是可索引的。
这也有点棘手。
冗长的解释:
1)SmallInteger
只是在VM中转换为整数。
实际上,SmallInteger
a
会在VM中转换为(a bitShift: 1) bitOr: 1
。
2)#at:put:
是一个原语,用于检查类是否可索引。可索引对象是可以发送#at:put:
,#at:
并且必须通过#new:
实例化的对象。这是获取变量实例的方法,这是唯一的方法。 (Tangent:OrderedCollection
正在实例化其他几个索引对象,让你多次调用#add:
,感觉长度是无限的。)
3)知道如果#at:put:
类中没有重新定义SmallIntager
,则原语必须首先检查对象是否为SmallInteger
,然后检查它是否可索引。这会导致一些性能损失。并重新定义#at:put:
上的SmallInteger
只需删除SmallInteger
支票。