Vec::iter()将转换为Option的借用。

4
以下是我的代码示例,它读取一个目录,遍历文件,并在每个文件末尾添加注释的简化版本...
这个示例展示了一个`Vec
2个回答

4

Vec::iter 返回一个 Iter 结构体,该结构体实现了 Iterator,具体如下:

impl<'a, T> Iterator for Iter<'a, T> {
    type Item = &'a T;
}

换句话说,每次调用 Iterator::next 返回的值类型将是指向向量中项目的引用。
如果您更改为 vec.into_iter(),您的代码将正常工作:
fn main() {
    let vec = vec![Some(true), None];

    vec.into_iter()
        .filter_map(|o| o)
        .count();
}

在这种情况下,您正在迭代一个IntoIter结构体,该结构体以不同的方式实现Iterator,返回对象本身:
impl<T> Iterator for IntoIter<T> {
    type Item = T;
}

这是必需的,因为每个向量项一次只能由一件事物拥有。通常情况下,您希望让向量拥有该项并操作引用。into_iter 消耗 向量,将整个向量的所有权转移给 IntoIter 结构体。然后,该结构体允许将每个项目的所有权交给 filter_map 调用。
如果您的类型实现了 Clone,还可以克隆每个项。这允许向量保持所有权并创建新项:
fn main() {
    let vec = vec![Some(true), None];

    vec.iter()
        .cloned()
        .filter_map(|o| o)
        .count();
}

1
这个怎么样:
fn main() {
    let my_vec = vec![Some(true), None];

    println!("{}", my_vec.iter().filter_map(|&x| x).count());
}

当使用filter_map时,您可以将&x映射到x,这样您的代码就能正常工作。
正如@Shepmaster在评论中指出的那样,这仅适用于实现了Copy的类型。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接