我正在尝试打印数组中的第一个数字,该数字不是恰好大于前一个数字的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)
}