Array
GNU Smalltalkのクラスで遊んでいると、メッセージがクラス(または他のスーパークラス)ではなく#at:put:
クラスに属していることに驚きました。なんで?SmallInteger
Array
Array
1 に答える
#at:put:
で定義されObject
ます。SmallInteger
インデックスを作成できず、サブクラスもインデックスに登録できないため、例外をスローするように再定義します。
また、これは少し注意が必要です。
長い説明:
1)SmallInteger
VMで整数に変換されるだけです。実際、はVMでにSmallInteger
a
変換されます。(a bitShift: 1) bitOr: 1
2)#at:put:
は、クラスがインデックス可能かどうかをチェックするプリミティブです。インデックス可能なオブジェクトは、送信できるオブジェクトであり、#at:put:
を#at:
介してインスタンス化する必要があります#new:
。これが可変インスタンスを持つ方法であり、これが唯一の方法です。(Tangent:OrderedCollection
他のいくつかのインデックス可能なオブジェクトをインスタンス化して、#add:
複数回呼び出して、長さが無限であるように感じられるようにします)。
3)クラスで#at:put:
再定義されていない場合SmallIntager
、プリミティブは最初にオブジェクトSmallInteger
がインデックス可能かどうかをチェックし、次にそれがインデックス可能かどうかをチェックする必要があることを知っています。これにより、パフォーマンスが低下します。そして、#at:put:
onを再定義すると、チェックSmallInteger
を外すだけです。SmallInteger