覆盖'+';在smalltalk中,接受两个参数?
是否可以覆盖smalltalk中的+运算符以接受两个参数?i、 例如,我还需要通过我的自定义类的单位。比如:覆盖'+';在smalltalk中,接受两个参数?,smalltalk,Smalltalk,是否可以覆盖smalltalk中的+运算符以接受两个参数?i、 例如,我还需要通过我的自定义类的单位。比如: Number subclass: #NumberWithUnits instanceVariableNames: 'myName unitTracker' classVariableNames: '' poolDictionaries: '' category: 'hw3' + aNumber theUnits unitTracker adjustUnits: theUnit
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())
,这是多么小的问题