0

ArrayGNU Smalltalkのクラスで遊んでいると、メッセージがクラス(または他のスーパークラス)ではなく#at:put:クラスに属していることに驚きました。なんで?SmallIntegerArrayArray

4

1 に答える 1

4

#at:put:で定義されObjectます。SmallIntegerインデックスを作成できず、サブクラスもインデックスに登録できないため、例外をスローするように再定義します。

また、これは少し注意が必要です。

長い説明:

1)SmallIntegerVMで​​整数に変換されるだけです。実際、は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

于 2011-06-15T14:50:41.793 に答える