gpt4 book ai didi

generics - 在当前范围内找不到类型 ::Type 的名为 len 的方法

转载 作者:行者123 更新时间:2023-11-29 08:15:56 24 4
gpt4 key购买 nike

我想通知 VecLengthDirector AbstractVecLengthBuider 的关联类型总是 [i32; n] (n ∈ N)。我写了下面的代码:

struct VecLengthDirector<T> {
builder: T,
}

impl<T> VecLengthDirector<T>
where
T: AbstractVecLengthBuider,
{
fn construct(&self) -> f64 {
let s = self.builder.get_start_point();
let e = self.builder.get_end_point();

let mut sum: i32 = 0;
for i in 0..s.len() {
sum += (s[i] - e[i]).pow(2);
}

(sum as f64).sqrt()
}
}

trait AbstractVecLengthBuider {
type PointType;
fn add_start_point(&mut self, point: Self::PointType);
fn get_start_point(&self) -> Self::PointType;
fn add_end_point(&mut self, point: Self::PointType);
fn get_end_point(&self) -> Self::PointType;
}

并报告错误。

error[E0599]: no method named `len` found for type `<T as AbstractVecLengthBuider>::PointType` in the current scope
--> src/main.rs:14:23
|
14 | for i in 0..s.len() {
| ^^^

error[E0608]: cannot index into a value of type `<T as AbstractVecLengthBuider>::PointType`
--> src/main.rs:15:21
|
15 | sum += (s[i] - e[i]).pow(2);
| ^^^^

error[E0608]: cannot index into a value of type `<T as AbstractVecLengthBuider>::PointType`
--> src/main.rs:15:28
|
15 | sum += (s[i] - e[i]).pow(2);
| ^^^^

最佳答案

快速修复

您需要指定 PointType 的种类.例如T: AbstractVecLengthBuider<PointType = [i32]>> .但是,[i32] 的大小在编译时未知,因此您可以将其替换为 Vec<i32> : T: AbstractVecLengthBuider<PointType = Vec<i32>> .

如果还是想泛型,可以约束PointType可借为[i32] :

impl<T, P> VecLengthDirector<T>
where
T: AbstractVecLengthBuider<PointType = P>,
P: ::std::borrow::Borrow<[i32]>,
{
fn construct(&self) -> f64 {
let s = self.builder.get_start_point().borrow();
let e = self.builder.get_end_point().borrow();
// ...
}
}

这不是惯用的 Rust。

惯用的 Rust 方式

您的循环可以重写为更惯用的 Rust:

s.iter()
.zip(e.iter())
.map(|(se, ee)| (se - ee).pow(2) as f64)
.sum()

那么你只需要约束PointType可迭代 i32 :

impl<T, P> VecLengthDirector<T>
where
T: AbstractVecLengthBuider<PointType = P>,
P: ::std::iter::IntoIterator<Item = i32>,
{
fn construct(&self) -> f64 {
let s = self.builder.get_start_point();
let e = self.builder.get_end_point();

s.into_iter()
.zip(e.into_iter())
.map(|(se, ee)| (se - ee).pow(2) as f64)
.sum::<f64>()
.sqrt()
}
}

关于generics - 在当前范围内找不到类型 <T as Trait>::Type 的名为 len 的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50392257/

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