如何在 toit 中将乘法重载到左侧?
How do I overload multiplication to the left in toit?
在问题Can I overload the + operator in Toit?中显示了如何通过另一个向量重载右加法。例如,如果我有一个向量 class,我如何将标量乘法重载到左侧?在下面的代码中,我希望 z 和 y 的计算结果相同,但我(可以理解)得到错误 Lookup failed when calling "multiply_from_float_" on a Vec1f.
class Vec1f:
x/float ::= ?
constructor x_in/Number:
x = x_in.to_float
operator * factor/Number -> Vec1f:
return Vec1f
x * factor
main:
x := Vec1f 1.0
y := x * 2.0
// error here
z := 2.0 * x
目前没有干净的方法来实现此功能。
就是说,如果您愿意依赖内部实施细节,这里是您的做法:
数字中的二元运算实现为double-dispatch。例如,float
上的 operator *
调用给定操作数上的 multiply_from_float_
。
因此,使 Vecif
成为工作操作数相对 straight-forward:
class Vecif:
...
multiply_from_float_ f/float: return this * f
请注意,此解决方案很脆弱,原因有二:
- 这取决于内部实现细节(例如名称
multiply_from_float_
)。
- 它在类型上不安全。
对于第 2 点,请查看 Number
class 的 operator *
声明:
abstract operator * other/Number
Number
class 期望 other
是一个数字。
目前,other
的类型不会传播到覆盖方法,但我们最终想这样做,然后 Vecif
将不再被接受。
在问题Can I overload the + operator in Toit?中显示了如何通过另一个向量重载右加法。例如,如果我有一个向量 class,我如何将标量乘法重载到左侧?在下面的代码中,我希望 z 和 y 的计算结果相同,但我(可以理解)得到错误 Lookup failed when calling "multiply_from_float_" on a Vec1f.
class Vec1f:
x/float ::= ?
constructor x_in/Number:
x = x_in.to_float
operator * factor/Number -> Vec1f:
return Vec1f
x * factor
main:
x := Vec1f 1.0
y := x * 2.0
// error here
z := 2.0 * x
目前没有干净的方法来实现此功能。
就是说,如果您愿意依赖内部实施细节,这里是您的做法:
数字中的二元运算实现为double-dispatch。例如,float
上的 operator *
调用给定操作数上的 multiply_from_float_
。
因此,使 Vecif
成为工作操作数相对 straight-forward:
class Vecif:
...
multiply_from_float_ f/float: return this * f
请注意,此解决方案很脆弱,原因有二:
- 这取决于内部实现细节(例如名称
multiply_from_float_
)。 - 它在类型上不安全。
对于第 2 点,请查看 Number
class 的 operator *
声明:
abstract operator * other/Number
Number
class 期望 other
是一个数字。
目前,other
的类型不会传播到覆盖方法,但我们最终想这样做,然后 Vecif
将不再被接受。