1

是否可以覆盖 smalltalk 中的 + 运算符以接受两个参数?即,我还需要为我的自定义类传递单位。就像是:

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


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

或者有没有我没有考虑过的更简单的方法来做到这一点?


附加问题描述:

(NumberWithUnits 值:3 单位:#seconds)应该给你一个代表 3 秒的NumberWithUnits。但是你也应该能够写 3 sec 并且应该评估为NumberWithUnits(Pharo 2.0 中已经采用了秒数)。这样做的方法是向 Number 添加一个 sec 方法,该方法基本上返回(NumberWithUnits value: self unit: #seconds)。您也可以为米和大象添加方法。然后你可以写一个表达式3大象/(1秒秒)它会返回正确的东西。写一个测试来确定!

4

2 回答 2

5

您缺少的是 Smalltalk 中的评估/优先顺序。它实际上比大多数其他语言要简单得多:

  1. 显式括号()
  2. 一元
  3. 二进制
  4. 关键词
  5. 任务:=

因此,您可以实现一个一元方法,Number在 binary 之前对其进行评估+。一个简单的例子是Number>>negated,它是 Smalltalk 的一元减号版本。

至少在 Squeak/Pharo 中(我现在已经很方便了),日期算术已经类似地实现了。Number>>minutes例如,查看,这样您就可以评估诸如 之类的东西5 hours - 3 minutes,它返回 a Durationof 0:04:57:00

于 2013-06-12T00:50:01.833 回答
4

我认为一个更惯用的方法是构造一个 second NumberWithUnits,然后添加它。

然后在您的+方法中,您需要协调要添加的两个事物的单位,然后添加它们的大小。

所以像

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 回答