#at:put:
определяется на Object
.SmallInteger
переопределяет его, чтобы выдать исключение, поскольку оно не индексируется и любой подкласс также не индексируется.
Также это немного сложнее.
Длинное объяснение:
1) SmallInteger
просто переводятся в целое число в виртуальной машине.Фактически SmallInteger
a
переводится в (a bitShift: 1) bitOr: 1
в виртуальной машине.
2) #at:put:
является примитивом, который проверяет, индексируется ли класс.Индексируемые объекты - это объекты, которые могут быть отправлены #at:put:
, #at:
и должны быть созданы с помощью #new:
.Это способ иметь переменные экземпляры, и это единственный способ.(Касательная: OrderedCollection
- это создание нескольких индексируемых объектов в другом, чтобы вы могли вызывать #add:
несколько раз и чувствовать, что длина была бесконечной).
3) Зная, что если #at:put:
не было переопределено вSmallIntager
class, примитив должен сначала проверить, является ли объект SmallInteger
, а затем проверить, индексируем ли он.Это может привести к снижению производительности.И переопределив #at:put:
на SmallInteger
, просто удалите проверку SmallInteger
.