所以我以下面的方式返回一个迭代器:
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指定为类型?
无论如何,这样做的正确方法是什么?
我确定在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(相对)中使用它.
| 归档时间: |
|
| 查看次数: |
188 次 |
| 最近记录: |