Quickfix
Необходимо указать вид 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()
}
}