Почему #at: put: в GNU Smalltalk сообщение SmallInteger? - PullRequest
0 голосов
/ 15 июня 2011

Играя с классом Array в GNU Smalltalk, я удивился, что сообщение #at:put: принадлежит классу SmallInteger вместо класса Array (или любому другому суперклассу Array),Почему?

1 Ответ

4 голосов
/ 15 июня 2011

#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.

...