首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为向量的迭代器元素添加类型注释?

如何为向量的迭代器元素添加类型注释?
EN

Stack Overflow用户
提问于 2018-10-22 15:58:42
回答 2查看 936关注 0票数 2

我有一个向量,它的值是特征定义的,我想使用这个向量上的Iterator特征提供的方法。

下面是我的用例的简化代码:

案件A

代码语言:javascript
复制
fn beta<T: Into<i32>>(s: Vec<T>) {
    for x in s {
        println!("{:?}", x.into());
    }
}

案例B

代码语言:javascript
复制
fn beta2<U: Into<i32>>(s: Vec<U>) {
    for x in s.iter() {
        println!("{:?}", x.into());
    } 
}

案例A是有效的,并按预期编译和运行。但是,案例B将引发编译时错误:

代码语言:javascript
复制
error[E0282]: type annotations needed
  --> src/main.rs:11:26
   |
11 |         println!("{:?}", x.into());
   |                          ^^^^^^^^ cannot infer type for `T`

在这种情况下,我应该将类型注释放在哪里?所期望的类型注释是什么?

游乐场

EN

回答 2

Stack Overflow用户

发布于 2018-10-22 16:10:21

一种可能是通知beta2 &U (而不是U)实现了Into<i32>

代码语言:javascript
复制
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转换为拥有的值:

代码语言:javascript
复制
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());
    }
}
票数 2
EN

Stack Overflow用户

发布于 2018-10-22 17:03:19

我不知道您确切的用例是什么,但我通常会假设可以克隆Into<u32>的类型,而且克隆成本很低,所以我认为最简单的解决方案是

代码语言:javascript
复制
fn beta2<U: Clone + Into<i32>>(s: &[U]) {
    for x in s.iter().cloned() {
        println!("{:?}", x.into());
    }
}

这将在调用.into()之前克隆每个元素,后者将消耗该克隆。

请注意,我已经将参数s更改为片。如果通过值来使用向量,那么使用第一个示例中的代码并没有什么害处,所以只有通过引用切片才有意义。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52933363

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档