所以我按以下方式返回迭代器:
pub fn get_iter_names(&self) -> ??? {
self.nodes.iter().cloned()
.filter(|x| x.is_some())
.map(|x| x.unwrap().name)
}
其中self.nodes
是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指定为类型?
无论如何,这样做的正确方法是什么?
答案 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(相对)中使用。