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

Ale*_*tev 4 iterator rust

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

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

哪里self.nodes是a Vec<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指定为类型?

无论如何,这样做的正确方法是什么?

Vla*_*eev 5

我确定在Stackoverflow上已经问了很多这个问题,但我找不到任何问题,所以你走了.

在Rust中,未装箱的闭包具有由编译器生成的匿名类型.因此,无法在类型签名中指定它们.这意味着无法按值返回未装箱的闭包.

通常的解决方案是设置返回值:

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))
}
Run Code Online (Sandbox Code Playgroud)

您应该指定任何类型name字段而不是???(我不能仅从您的代码中推断出它).

一个RFC允许返回实现某些特征的未装箱值,但它被推迟了.根据RFC PR中的讨论,看起来最近至少有一些工作已经完成,因此很快就可以在Rust(相对)中使用它.