覆盖'+';在smalltalk中,接受两个参数?

覆盖'+';在smalltalk中,接受两个参数?,smalltalk,Smalltalk,是否可以覆盖smalltalk中的+运算符以接受两个参数?i、 例如,我还需要通过我的自定义类的单位。比如: Number subclass: #NumberWithUnits instanceVariableNames: 'myName unitTracker' classVariableNames: '' poolDictionaries: '' category: 'hw3' + aNumber theUnits unitTracker adjustUnits: theUnit

是否可以覆盖smalltalk中的+运算符以接受两个参数?i、 例如,我还需要通过我的自定义类的单位。比如:

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


+ aNumber theUnits
    unitTracker adjustUnits: theUnits.
    ^super + aNumber
或者有没有一种我没有考虑过的更简单的方法


其他问题说明:

(NumberWithUnits值:3单位:#秒)应该为您提供一个表示3秒的NumberWithUnits。但是你也应该能够写3秒,这应该是一个以单位计算的数值(在Pharo 2.0中已经用了秒)。实现这一点的方法是向Number添加一个sec方法,它基本上返回(NumberWithUnits值:self unit:#seconds)。您还可以为米和大象添加方法。然后您可以编写一个表达式3大象/(1秒),它将返回正确的内容。为它写一个测试来确定


我认为一种更惯用的方法是构造第二个带有单位的
数字,然后添加它

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

大概是

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.
    ]

]

另请参见示例。

我认为更惯用的方法是构造第二个带有单位的
数字,然后添加它

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

大概是

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.
    ]

]

另请参见示例。

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

  • 显式括号
    ()
  • 一元
  • 二进制的
  • 关键词
  • 作业
    :=
  • 因此,您可以在
    Number
    上实现一元方法,该方法在二进制
    +
    之前求值。一个简单的例子是否定的,这是Smalltalk版本的一元负号


    至少在Squeak/Pharo(目前我所能做的一切)中,日期算法已经得到了类似的实现。例如,查看
    Number>>minutes
    ,这样您就可以计算
    5小时-3分钟
    ,它返回
    持续时间
    0:04:57:00

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

  • 显式括号
    ()
  • 一元
  • 二进制的
  • 关键词
  • 作业
    :=
  • 因此,您可以在
    Number
    上实现一元方法,该方法在二进制
    +
    之前求值。一个简单的例子是否定的,这是Smalltalk版本的一元负号



    至少在Squeak/Pharo(目前我所能做的一切)中,日期算法已经得到了类似的实现。例如,看一下
    Number>>minutes
    ,你可以计算
    5小时-3分钟
    ,它返回
    持续时间
    0:04:57:00

    ,所以你想做“2米加3英尺”之类的操作?是的,甚至是2小时+3个象素,在这种情况下,你想得到一个它们不可测量的错误?是的,至少对于加法/减法。乘法/除法是可以接受的。顺便说一句,你想做像“2米加3英尺”这样的运算吗?是的,甚至是2小时加3个象素,在这种情况下,你想要一个它们不可通约的错误?是的,至少对于加法/减法。乘法/除法是可以接受的。顺便问一下,.Hm,你能给我一个例子,说明什么时候在算术中会调用否定吗?也许我可以定义类似的东西?因为
    +
    是一个二进制消息,
    否定的
    是一个一元消息,所以它会在++之前调用。看看日期算术是如何工作的,这正是你想要的
    Duration
    相当于您的
    NumberWithUnits
    ,我猜他们要求您实现另一个类来执行实际计算,然而,
    Duration
    本身处理这个问题。我看不出优先级或求值顺序在这里有什么关系。优先级在这里非常重要:如果二元运算符比一元运算符绑定得更紧密,那么
    5小时-3分钟
    将解析为
    ((5小时)-3分钟
    ,而不是所需的
    ((5小时)-(3分钟)
    。因此,您的观点实际上是OP不应该将
    a+3秒
    视为
    a.add(3秒)
    (使用java ish语法),而应该视为
    a.add(3.sec())
    这就是Smalltalk对它的解释。从这里我的回答是,当你到达
    +
    时,这些单位应该已经被合并到
    数字中了。嗯,那么你能给我一个例子说明什么时候在算术过程中会调用否定吗?也许我可以如何定义一些东西ilar?因为
    ++
    是一个二进制消息,而
    否定的
    是一元消息,所以它会在++之前调用。看看日期算术是如何工作的,这正是你想要的。
    持续时间
    相当于你的
    数字,它的单位
    ,我猜他们要求你实现另一个类来执行实际的计算计算,而
    Duration
    本身处理这个问题。我看不出优先级或求值顺序在这里有什么关系。优先级在这里非常重要:如果二进制运算符比一元运算符绑定得更紧,那么
    5小时-3分钟
    将解析为
    ((5小时)-3)分钟
    ,而不是所需的
    ((5小时)-(3分钟)
    。因此,您的观点是OP不应该将
    a+3秒
    视为
    a.add(3秒)
    (使用java ish语法),而应该视为
    a.add(3.sec())
    ,这是多么小的问题