问题描述
在问题Can I overload the + operator in Toit?中,它显示了如何通过另一个向量重载右加法。例如,如果我有一个向量类,我该如何重载标量乘法到左边?在下面的代码中,我希望z和y的值相同,但我(可以理解)得到错误>>> MyClass.__dict__['printline']
<function MyClass.printline at 0x10979a710>
Lookup Failed when calling "multiply_from_float_" on a Vec1f.
解决方法
目前尚无清除方法来实现此功能。
也就是说,如果您愿意依靠内部实施细节,那么您将如何做:
数字二进制操作被实现为双调度。例如,operator *
上的float
调用给定操作数上的multiply_from_float_
。
因此,将Vecif
设为有效的操作数是相对简单的:
class Vecif:
...
multiply_from_float_ f/float: return this * f
请注意,此解决方案比较脆弱,原因有二:
- 这取决于内部实现细节(例如名称
multiply_from_float_
)。 - 这通常是不安全的。
对于第2点,请查看Number
类的operator *
声明:
abstract operator * other/Number
Number
类期望other
是一个数字。
目前,other
的类型尚未传播到覆盖方法,但我们最终希望这样做,然后Vecif
将不再被接受。