我这里有一个示例代码:
use std::iter::Filter;
use std::slice::Iter;
fn main() {
let numbers = vec![12i32, 26, 31, 56, 33, 16, 81];
for number in ends_in_six(numbers) {
println!("{}", number);
}
}
fn ends_in_six(numbers: Vec<i32>) /* -> ??? */ {
numbers.iter().filter(|&n| *n % 10 == 6)
}
我试图返回一个迭代器,在Rust中这一直是一个棘手的问题。从我收集到的信息来看,运行这里的代码会给我带来以下错误:
<anon>:13:5: 13:45 error: mismatched types:
expected `()`,
found `core::iter::Filter<core::slice::Iter<'_, i32>, [closure <anon>:13:27: 13:44]>`
(expected (),
found struct `core::iter::Filter`) [E0308]
<anon>:13 numbers.iter().filter(|&n| *n % 10 == 6)
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
现在,在这个基础上工作(根据我相对有限的了解,这是所有工作的基础),似乎我应该做一些像这样的事情:
fn ends_in_six<'a>(numbers: Vec<i32>) -> Filter<Iter<'a, i32>, /* ??? */> {
现在我又遇到了麻烦,因为我得到的是 [closure <anon>:13:27: 13:44]
而不是实际类型。即使我尝试使用这里的函数来查找类型,我也得到了:
core::iter::Filter<core::slice::Iter<i32>, [closure((&&i32,)) -> bool]>
因此,我试图自己找出答案,并根据前一行尝试了以下内容:
fn ends_in_six<'a>(numbers: Vec<i32>) -> Filter<Iter<'a, i32>, Fn(&&i32) -> bool> {
我尝试了一下,并且收到更多错误,因为Fn在编译时不是常量(即不实现Sized)。这很有道理,但是我有点迷茫,不知道该尝试什么。
编辑:我刚刚尝试了:
fn ends_in_six<'a, F>(numbers: Vec<i32>) -> Filter<Iter<'a, i32>, F>
where F: Fn(&&i32) -> bool {
现在我遇到了以下错误:
<anon>:7:19: 7:30 error: unable to infer enough type information about `_`; type annotations required [E0282]
<anon>:7 for number in ends_in_six(numbers) {
^~~~~~~~~~~
<anon>:14:32: 14:34 error: the type of this value must be known in this context
<anon>:14 numbers.iter().filter(|&n| *n % 10 == 6)
^~
<anon>:14:27: 14:44 error: mismatched types:
expected `F`,
found `[closure <anon>:14:27: 14:44]`
(expected type parameter,
found closure) [E0308]
<anon>:14 numbers.iter().filter(|&n| *n % 10 == 6)
^~~~~~~~~~~~~~~~~
Iterator
,其大小未知。 - Shepmasterimpl Trait
返回类型,摆脱装箱也很容易。 - user395760