如何在乘法中向左重载乘法?

问题描述

在问题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

请注意,此解决方案比较脆弱,原因有二:

  1. 这取决于内部实现细节(例如名称multiply_from_float_)。
  2. 这通常是不安全的。

对于第2点,请查看Number类的operator *声明:

  abstract operator *  other/Number

Number类期望other是一个数字。 目前,other的类型尚未传播到覆盖方法,但我们最终希望这样做,然后Vecif将不再被接受。