尝试编译此代码时出现奇怪的错误:
pub trait ValueGiver<T> {
fn give(_: Option<Self>) -> T;
}
struct m;
impl<f64> ValueGiver<f64> for m {
fn give(_:Option<m>) -> f64 {
0.5f64
}
}
fn main() {
let y : f64 = ValueGiver::give(None::<m>);
}
(选项部分是调用静态特征方法的技巧)
我明白了:
c.rs:64:5: 68:6 error: unable to infer enough type information about `_`; type annotations required
c.rs:64 impl<f64> ValueGiver<f64> for m {
c.rs:65 fn give(_:Option<m>) -> f64 {
c.rs:66 0.5f64
c.rs:67 }
c.rs:68 }
我不知道哪个部分不清楚推理,错误信息不是很有帮助
答案 0 :(得分:2)
仅使用impl<f64>
替换impl
。您不需要通用impl,您需要特定的impl。您可以将impl<T>
写入定义类型参数,稍后您可以在impl中使用这些参数;你不需要这个。
当您编写impl<f64>
时,此f64
被解释为类型参数。但是,impl中f64
的所有其他匹配项都被解释为f64
关键字,它指定原始f64
类型。编译器抱怨,因为它无法推断出f64
类型参数的具体类型。
如果我们将impl<f64>
替换为impl<T>
,we get the same error。