1

smalltalk で + 演算子をオーバーライドして 2 つのパラメーターを受け入れることは可能ですか? つまり、カスタム クラスの単位も渡す必要があります。何かのようなもの:

Number subclass: #NumberWithUnits
instanceVariableNames: 'myName unitTracker'
classVariableNames: ''
poolDictionaries: ''
category: 'hw3'


+ aNumber theUnits
    unitTracker adjustUnits: theUnits.
    ^super + aNumber

または、私が考慮していないこれを行う簡単な方法はありますか?


追加の問題の説明:

(NumberWithUnits 値: 3 単位: #seconds)は、 3 秒を表すNumberWithUnitsを提供する必要があります。しかし、3 秒を書き込むこともでき、これは NumberWithUnits に評価されるはずです (秒はPharo 2.0 で既に取得されています)。これを行う方法は、基本的に(NumberWithUnits value: self unit: #seconds)を返す sec メソッドを Number に追加することです。メートルと象のメソッドも追加できます。次に、式3 象 / (1 秒 秒)を書くと、正しいものが返されます。それを確かめるためにテストを書いてください!

4

2 に答える 2

5

あなたが見逃しているのは、Smalltalk での評価/優先順位です。実際には、他のほとんどの言語よりもかなり単純です。

  1. 明示的な括弧()
  2. 単項
  3. バイナリ
  4. キーワード
  5. 割り当て:=

Numberしたがって、バイナリの前に評価される単項メソッドを実装できます+。簡単な例はNumber>>negated、単項マイナスの Smalltalk バージョンです。

少なくとも Squeak/Pharo (現時点で手元にあるものすべて) では、日付演算はすでに同様に実装されています。たとえば、 を見てNumber>>minutes、 のようなものを評価できます。これはを5 hours - 3 minutes返します。Duration0:04:57:00

于 2013-06-12T00:50:01.833 に答える
4

これを行うためのより慣用的な方法は、2番目NumberWithUnitsの を構築してから追加することだと思います。

次に、+メソッド内で、追加される 2 つのものの単位を調整し、それらの大きさを追加する必要があります。

だから何か

a := Measure new: 2 #m
b := Measure new: 10 #mm

a + b

Measure class [

    + other [
        "TODO: check/convert units here"
        resultMagnitude := (a magnitude) + (b magnitude).
        combinedUnits := (a units) * (b units).
        ^Measure new resultMagnitude units: combinedUnits.
    ]

]

たとえば、演算子のオーバーロードの GNU Smalltalkの例も参照してください。

于 2013-06-12T00:46:57.333 に答える