为什么#at:put:在SmallInteger的GNU Smalltalk消息中?

时间:2011-06-15 09:18:18

标签: smalltalk gnu-smalltalk

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

1 个答案:

答案 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支票。