< 返回版块

eweca 发表于 2021-01-07 23:09

稀疏矩阵计算库sprs没有实现trait<'a> Mul<'a CsMat> for f64导致无法计算如下式子f64 * CsMat。但是我尝试实现这个trait直接失败了,说是不能为外部库实现外部库的trait,我可以理解这是孤儿原则的体现,我目前的做法是使用pub struct MyCsMat包装一层。请问,还有其他做法吗?

#[derive(Debug, PartialEq, Clone)]
pub struct MyCsMat {
    data: CsMat<f64>,
}

impl<'a> Mul<&'a MyCsMat> for f64 {
    type Output = MyCsMat;

    fn mul(self, other: &'a MyCsMat) -> Self::Output {
        MyCsMat{ data: other.data.map(|i| i * self) }
    }
}

评论区

写评论
作者 eweca 2021-01-08 11:05

好吧,老实用enum包装了。

--
👇
jonirrings: 根据孤儿原则,不能。

作者 eweca 2021-01-08 11:00

new type是指?如果是说type MyCsMat = CsMat<f64>或是type MyCsMat = Box<CsMat<f64>>,都不行的啊。用enum也是可行的,但是貌似复杂度和写struct是一样的。都没法利用CsMat已经重载的所有运算符。

--
👇
Mike Tang: 可以考虑newtype一下。

jonirrings 2021-01-08 10:19

根据孤儿原则,不能。

Mike Tang 2021-01-07 23:35

可以考虑newtype一下。

1 共 4 条评论, 1 页