3

「 7週間の7つの言語」という本には質問があります。

分母がゼロの場合、どのように/を変更して0を返しますか?

スレッドのおかげでメソッド内の自己の重要性は何ですか?私には実用的な解決策がありますが、Number "/"メソッドを壊さずに、代わりにNumberをサブクラス化することを試みたかったのです。これが私が試したことです:

Zeroable := Number clone
Zeroable / = method(denom, if(denom == 0, 0, self proto / denom))

ただし、これは機能しません。Zeroableのインスタンスをインスタンス化しようとすると、数値のように動作します。

Io> ten := Zeroable 10
==> 10
Io> ten type
==> Number
Io> ten / 5
==> 2
Io> ten / 0
==> inf
Io> ten slotNames
==> list()

Zeroableを「通常の」方法でインスタンス化した場合、値は常に0であり、変更する方法がないようです。

Io> zero := Zeroable clone
==> 0
Io> zero type
==> Zeroable
Io> zero / 0
==> 0
Io> zero / 2
==> 0

問題はインスタンス化される方法だと思いますがten、クローンメソッドに「引数」を渡す方法や、0ではないZeroableを作成する方法がわかりません。ここで何が起こっているのでしょうか。

4

1 に答える 1

3

clone に引数を渡すことはできません。clone は次のように効果的に設定されます。

clone := method(
  obj := primitiveAllocateMemory(sizeof(self))
  obj parent := self
  obj do(?init)
)

第二に、そのようにサブクラス化することはできませんNumber。Number オブジェクトは、レキサーが数値リテラルに遭遇したときに作成され、 type が与えられNumberます。このオブジェクトは、メッセージのキャッシュされた結果として設定されます。つまり、メッセージをインターセプトして他のオブジェクトとして評価しても、Number が返されます。事実上、これはパフォーマンス上の理由からのメッセージ評価の短絡です。

別の Number 型が必要な場合は、必要な操作で実際に自分で実装する必要があります。これは、オブジェクト (または他のオブジェクト) をサブクラス化し、必要なすべての動作を実装することを意味します。Number をサブクラス化する場合、Number のメソッドの実装では、サブクラス (数値の格納方法) を理解できないことに注意してください。Number メソッドは、スロット テーブルではなく、オブジェクトにエンコードされた数値を想定します。

于 2012-06-06T12:35:34.977 に答える