iterator - iter().cloned().filter().map() 的返回类型应该是什么

标签 iterator rust

<分区>

所以我用下面的方式返回一个迭代器:

pub fn get_iter_names(&self) -> ??? {
self.nodes.iter().cloned()
    .filter(|x| x.is_some())
    .map(|x| x.unwrap().name)
}

哪里self.nodesVec<Option<Node>>Node已归档name .问题是返回类型应该是什么。我的编译器说 core::iter::Map<core::iter::Filter<core::iter::Cloned<core::slice::Iter<'_, core::option::Option<core::node::ComputeNode>>>, [closure@src/core/graph.rs:931:12: 931:27]>, [closure@src/core/graph.rs:932:9: 932:28]> , 但问题是我不知道如何将 clousure 指定为类型?

执行此操作的正确方法是什么?

最佳答案

我确定这个问题在 Stackoverflow 上被问了很多,但我找不到,所以你去吧。

在 Rust 中,未装箱的闭包具有由编译器生成的匿名 类型。因此,没有方法可以在类型签名中指定它们。这意味着不可能按值(value)返回未装箱的闭包。

通常的解决方案是将返回值装箱:

pub fn get_iter_names(&self) -> Box<Iterator<Item=???>> {
    Box::new(self.nodes.iter().cloned()
        .filter(|x| x.is_some())
        .map(|x| x.unwrap().name))
}

您应该指定 name 字段的任何类型,而不是 ???(我无法仅从您的代码中推断出来)。

an RFC允许返回未装箱的值实现某些特征,但它被推迟了。根据该 RFC PR 中的讨论,看起来最近至少在这方面做了一些工作,因此它可能很快就会(相对)在 Rust 中可用。

关于iterator - iter().cloned().filter().map() 的返回类型应该是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31879763/

相关文章:

rust - 在 Rust 中从 if else 条件赋值的惯用方式

rust - 如何移动拥有的指针

c++ - 迭代时从 vector 和内存中删除一个对象

java - 如何跳出Java 8 Iterator.forEachRemaining循环里面的方法?

结构编译器错误 vector 的 C++ 迭代器

rust - 是否可以专注于静态生命周期?

rust - 在 Rust 中,clone() 和 to_owned() 有什么区别?

java - Java如何通过迭代器迭代XML文件?

python - Python 中迭代器的静态行为

generics - Trait::<T> 和 <Trait<T>> 有什么区别?