如何在iter的位置方法中访问索引



我正在尝试打印数组中的第一个数字,该数字不是恰好大于前一个数字的1(以下示例中的预期结果是7(。

我写&n > 0 &&是为了避免在第一个数字之前检查(不存在的(数字。

fn main() {
let numbers = [4, 5, 7];
let result = numbers.iter().position(|&n| &n > 0 && n != numbers[&n - 1] + 1);
println!("{:?}", result);
}

我得到这个关于0:的编译器错误

预期引用,找到整数

帮助:考虑在此处借用:&0

基本上我正在尝试做这个JavaScript所做的事情:

numbers.find((n, i) => i && n != numbers[i - 1] + 1);

有人能告诉我我做错了什么吗?

我假设n是值,&n是索引。如果这不正确,那么我如何获得lamba内部的索引?

查看切片中每对两个连续项的另一种方法windows(2)迭代器:

fn find_non_consecutive(a: &[i32]) -> Option<i32> {
a.windows(2).find(|x| x[0] + 1 != x[1]).map(|x| x[1])
}

position用于搜索元素。由于您需要检查数组中的所有元素,因此使用enumerate来访问元素索引和值:

fn main() {
let numbers = [4, 5, 7];
let result = numbers.iter().enumerate().filter_map(|(i, &n)| {
if i > 0 && n != numbers[i-1] + 1 {
Some(n)
} else {
None
}
});
println!("{:?}", result.collect::<Vec<i32>>());
}

游乐场。

如果你只需要找到第一个这样的元素,你可以使用find_map而不是filter_map:

fn main() {
let numbers = [4, 5, 7];
let result = numbers.iter().enumerate().find_map(|(i, &n)| {
if i > 0 && n != numbers[i-1] + 1 {
Some(n)
} else {
None
}
});
println!("{:?}", result);
}

如果您查看Iterator::position的签名,您将看到其predicate闭包参数实现了FnMut(Self::Item) -> bool

换句话说,参数&n的类型为<numbers.iter() as Iterator>::Item,即&i32(对numbers元素的引用(。Iterator::position不为其predicate闭包提供对迭代索引的访问权限——正如Psidom所证明的,这就是Iterator::enumerate所做的。

但是,我建议对numbers数组进行索引不是解决这个问题的惯用方法。如果没有其他内容,它就不能更普遍地应用于其他可迭代对象。也许相反,在数组上使用两个迭代器,一个是一个元素,将它们压缩并成对比较它们的元素?

fn main() {
let numbers = [4, 5, 7];

let first = numbers.iter();
let second = numbers.iter().skip(1);

let result = first.zip(second)
.find_map(|(&a, &b)| if b == a + 1 { None } else { Some(b) });

println!("{:?}", result);
}

在操场上看。

我很难创建一个可以随心所欲使用的单独函数,所以以下是最终成功的方法:

fn find_non_consecutive(array_of_numbers: &[i32; 3]) -> Option<i32> {
let result = array_of_numbers.iter().enumerate().find_map(|(i, &n)| {
if i > 0 && n != array_of_numbers[i - 1] + 1 {
Some(n)
} else {
None
}
});
return result;
}
fn main() {
let numbers: [i32; 3] = [4, 5, 7];
let result = find_non_consecutive(&numbers);
println!("{:?}", result); // Some(7)
}

最新更新