gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 07:46:27 26 4
gpt4 key购买 nike

use generic_array::*; // 0.12.3
use num::{Float, Zero}; // 0.2.0

#[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 {
self.data
.iter()
.zip(other.data.iter())
.fold(T::zero(), |acc, x| acc + *x.0 * *x.1)
}

fn length_sq(&self) -> T {
self.dot(self.clone())
}
}
error[E0308]: mismatched types
--> src/lib.rs:21:18
|
21 | self.dot(self.clone())
| ^^^^^^^^^^^^ expected struct `Vector`, found reference
|
= note: expected type `Vector<T, N>`
found type `&Vector<T, N>`

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

如果我自己实现 Clone,为什么这会起作用?

use generic_array::*; // 0.12.3
use num::{Float, Zero}; // 0.2.0

#[derive(Debug)]
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 {
Vector::<T, N> {
data: self.data.clone(),
}
}
}

impl<T, N: ArrayLength<T>> Vector<T, N>
where
T: Float + Zero,
{
fn dot(&self, other: Self) -> T {
self.data
.iter()
.zip(other.data.iter())
.fold(T::zero(), |acc, x| acc + *x.0 * *x.1)
}

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

最佳答案

当您的类型未实现 Clone 时,您会收到此错误:

struct Example;

fn by_value(_: Example) {}

fn by_reference(v: &Example) {
by_value(v.clone())
}
error[E0308]: mismatched types
--> src/lib.rs:6:14
|
6 | by_value(v.clone())
| ^^^^^^^^^ expected struct `Example`, found &Example
|
= note: expected type `Example`
found type `&Example`

这是由于自动引用规则:编译器认为 Example没有实现 Clone , 所以它改为尝试使用 Clone&Example , 不可变引用总是实现 Clone .

你的原因Vector类型未实现 Clone是因为the derived Clone implementation doesn't have the right bounds on the type parameters (Rust issue #26925) .尝试显式编写 self.dot(Self::clone(self))按照这些行获取错误消息。

另见:

关于reference - 为什么克隆我的自定义类型会导致 &T 而不是 T?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37765586/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com