首页 文章

为什么克隆我的自定义类型导致&T而不是T?

提问于
浏览
3
#![feature(type_macros)]
extern crate typenum;
#[macro_use]
extern crate generic_array;
extern crate num;
use num::{Float, Zero};
use typenum::*;
use generic_array::*;

#[derive(Clone, Debug)]
struct Vector<T, N: ArrayLength<T>>{
    data: GenericArray<T, N>
}

impl<T, N: ArrayLength<T>> Vector<T, N>
where T: Float + Zero {

    fn dot(&self, other: Self) -> T{
        return self.data.iter().zip(other.data.iter())
                               .fold(T::zero(), |acc, x|{
            return acc + *x.0 * *x.1;
        });
    }

    fn length_sq(&self) -> T{
        return self.dot(self.clone());
    }
}

src / main.rs:41:25:41:37错误:不匹配的类型[E0308] src / main.rs:41返回self.dot(self.clone()); ^ ~~~~~~~~~~~ src / main.rs:41:25:41:37求助:运行rustc - 解释E0308详细说明src / main.rs:41:25:41: 37注意:预期类型Vector <T,N> src / main.rs:41:25:41:37注意:找到类型&Vector <T,N>

为什么会这样?为什么 clone 返回T而不是T?

现在,如果我自己实现克隆

#![feature(type_macros)]
extern crate typenum;
#[macro_use]
extern crate generic_array;
extern crate num;
use num::{Float, Zero};
use typenum::*;
use generic_array::*;

struct Vector<T, N: ArrayLength<T>>{
    data: GenericArray<T, N>
}

impl<T: Float, N: ArrayLength<T>> Clone for Vector<T, N>{
    fn clone(&self) -> Self{
        return Vector::<T, N>{data: self.data.clone()};
    }
}

impl<T, N: ArrayLength<T>> Vector<T, N>
where T: Float + Zero {
    fn max(&self) -> T{
        return self.data.iter().fold(T::zero(), |acc, &x|{
            if x > acc {
                return x;
            }
            else{
                return acc;
            }
        });
    }

    fn dot(&self, other: Self) -> T{
        return self.data.iter().zip(other.data.iter())
                               .fold(T::zero(), |acc, x|{
            return acc + *x.0 * *x.1;
        });
    }

    fn length_sq(&self) -> T{
        return self.dot(self.clone());
    }
}

这有效,但为什么呢?

1 回答

  • 6

    您的类型未实现 Clone 的原因是https://github.com/rust-lang/rust/issues/26925:派生的 Clone 实现在类型参数上没有正确的边界 . 尝试显式编写 self.dot(Self::clone(self)) 以获取这些行的错误消息 .

    您收到奇怪错误消息的原因是自动引用规则:编译器发现 Vector 没有实现 Clone ,因此它尝试在 &Vector 上使用Clone,并且不可变引用始终实现Clone .

相关问题