我有一个向量,它的值是特征定义的,我想使用这个向量上的Iterator特征提供的方法。
下面是我的用例的简化代码:
案件A
fn beta<T: Into<i32>>(s: Vec<T>) {
for x in s {
println!("{:?}", x.into());
}
}案例B
fn beta2<U: Into<i32>>(s: Vec<U>) {
for x in s.iter() {
println!("{:?}", x.into());
}
}案例A是有效的,并按预期编译和运行。但是,案例B将引发编译时错误:
error[E0282]: type annotations needed
--> src/main.rs:11:26
|
11 | println!("{:?}", x.into());
| ^^^^^^^^ cannot infer type for `T`在这种情况下,我应该将类型注释放在哪里?所期望的类型注释是什么?
发布于 2018-10-22 16:10:21
一种可能是通知beta2 &U (而不是U)实现了Into<i32>
fn beta2<U>(s: Vec<U>)
where
for<'a> &'a U: Into<i32>,
{
for x in s.iter() {
println!("{:?}", x.into());
}
}注意,Into接受self而不是&self,即它使用它的参数。因此,您必须找到某种方法将借来的x转换为拥有的值:
fn beta2<U, U2>(s: Vec<U>)
where
U: std::borrow::ToOwned<Owned = U2>,
U2: Into<i32> + std::borrow::Borrow<U>,
{
for x in s.iter() {
println!("{:?}", x.to_owned().into());
}
}发布于 2018-10-22 17:03:19
我不知道您确切的用例是什么,但我通常会假设可以克隆Into<u32>的类型,而且克隆成本很低,所以我认为最简单的解决方案是
fn beta2<U: Clone + Into<i32>>(s: &[U]) {
for x in s.iter().cloned() {
println!("{:?}", x.into());
}
}这将在调用.into()之前克隆每个元素,后者将消耗该克隆。
请注意,我已经将参数s更改为片。如果通过值来使用向量,那么使用第一个示例中的代码并没有什么害处,所以只有通过引用切片才有意义。
https://stackoverflow.com/questions/52933363
复制相似问题