【问题标题】:Rust doesn't see my overloaded f64 multiplication operatorRust 看不到我重载的 f64 乘法运算符
【发布时间】:2015-01-18 13:25:33
【问题描述】:

我正在 rust 中实现一个简单的矩阵库,我目前正在编写用于标量乘法的运算符。右乘有效:

impl<T: Num + Zero + Clone + Float> Mul<T, Mat<T>> for Mat<T> {
    fn mul(&self, rhs: &T) -> Mat<T> {
        self.componentwise(|v| v.clone() * *rhs)
    }
}

但我似乎不能做左乘,我认为下面的代码会做我想做的事:

impl<T: Num + Zero + Clone + Float> Mul<Mat<T>, Mat<T>> for T {
    fn mul(&self, rhs: &Mat<T>) -> Mat<T> {
        rhs.componentwise(|v| *self * v.clone())
    }
}

但以下不起作用:

let A = mat![[1f64, 2., 3.], [4., 5., 6.]];
let P = A * 4f64; // works!
let Q = 4f64 * A; // error...

错误是error: mismatched types: expected `f64`, found `linalg::Mat&lt;f64&gt;` (expected f64, found struct linalg::Mat)。我只能有 f64 * f64 乘法,还是我接近第二种情况是错误的?我尝试使用 impl Mul&lt;Mat&lt;f64&gt;, Mat&lt;f64&gt;&gt; for f64 专门为 f64 实现它,但这仍然不起作用。

我发现我可以使用4f64.mul(&amp;A) 使其工作,但这并不理想。

【问题讨论】:

  • Multidispatch 使它适用于方法调用语法,但显然运算符语法不能正确执行多分派......
  • @FrancisGagné:据我所知,关联类型仍在进行中,我并不感到惊讶。我相信它预计适用于 1.0。

标签: operator-overloading rust matrix-multiplication multiplication


【解决方案1】:

也许它与声明有关:您的 seconde impl declration 是针对Mult&lt;Mat&lt;T&gt;, Mat&lt;T&gt;&gt;,所以我的猜测是它允许将两个矩阵相乘,这不是您想要的。

(我想发表评论,但我还不能这样做:()

【讨论】:

  • 不,这是不正确的。 Mul trait 是这样定义的:trait Mul&lt;RHS, R&gt;,即第一个参数是* 右边参数的类型,第二个参数是结果类型。左参数的类型是Self,即实现特征的类型。
  • 我的错,抱歉回答不好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-17
  • 2021-07-18
相关资源
最近更新 更多