【发布时间】:2016-03-13 16:32:37
【问题描述】:
我正在尝试使用num crate Float trait 在我的库中实现泛型,但我一直在与编译器作斗争。这有效:
struct Vector<T> {
data: Vec<T>,
}
trait Metric<T> {
fn norm(&self) -> T;
}
impl Metric<f32> for Vector<f32> {
fn norm(&self) -> f32 {
let mut s = 0.0;
for u in &self.data {
s = s + u * u;
}
s.sqrt()
}
}
但这不是:
use num::Float; // 0.2.0
struct Vector<T> {
data: Vec<T>,
}
trait Metric<T> {
fn norm(&self) -> T;
}
impl<T: Float> Metric<T> for Vector<T> {
fn norm(&self) -> T {
let mut s = T::zero();
for u in &self.data {
s = s + u * u;
}
s.sqrt()
}
}
后者给了我以下错误:
error[E0369]: binary operation `*` cannot be applied to type `&T`
--> src/lib.rs:16:23
|
16 | s = s + u * u;
| - ^ - &T
| |
| &T
|
= note: an implementation of `std::ops::Mul` might be missing for `&T`
如果我删除引用并迭代 self.data,我会得到一个
error[E0507]: cannot move out of borrowed content
--> src/lib.rs:15:18
|
15 | for u in self.data {
| ^^^^^^^^^ cannot move out of borrowed content
【问题讨论】: