rust 如何使用for循环结构迭代Option〈&Path>?

aiqt4smr  于 2023-02-23  发布在  其他
关注(0)|答案(2)|浏览(196)

我在遍历一个Path引用的向量,现在我使用一个crate来返回Option<&Path>类型,我读到Option有一个迭代器,但是有没有一种方法可以维护我的forloop结构,比如:

let mut paths: Vec<&Option<&Path>> = vec![];
for i in paths {
...
}

因为我需要检查当前的迭代路径值是否存在。我是这样做的:

if std::path::Path::new(&i).exists()

显然std::path::Path不满足std::option::Option
我有没有办法维持这种结构并满足Option类型?特别是,我该如何修改if语句来满足它?

v9tzhpje

v9tzhpje1#

对于每个值,您只需要检查它是否为Option::Some
因为Option确实是可迭代的,所以可以只使用这个属性:

for i in paths.into_iter().flatten() {
    ...
}

一个Option在概念上是0或1个元素的集合,通过展平它可以移除Option::None示例,并将Option::Some替换为它们所包含的任何内容(路径)。
顺便说一句,为什么要从Path创建Path?您可以只选中if i.exists(),因为i已经是&Path了。

7ajki6be

7ajki6be2#

for path in paths {
    if let Some(path) = path {
        if path.exists() {
            // ...
        }
    }
}

或者:

// `flatten` will turn the iterator of `Option<Path>` to an iterator of `Path`, discarding the `None` values
for path in paths.iter().flatten() {
    if path.exists() {
       // ...
    }
}

或者:

for path in paths.iter().flatten().filter(|p| p.exists()) {
    // ...
}

相关问题