如何在 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

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

  1. 这取决于内部实现细节(例如名称 multiply_from_float_)。
  2. 它在类型上不安全。

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

  abstract operator *  other/Number

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