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

时间:2015-08-07 14:09:55

标签: 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指定为类型?

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

1 个答案:

答案 0 :(得分:5)

我确定在Stackoverflow上已经对这个问题进行了很多询问,但我找不到任何问题,所以现在就去。

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

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

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(相对)中使用。