我正在尝试打印数组中的第一个数字,该数字不完全大于前一个数字(在下面的示例中,预期结果是1 )。
我编写&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内得到索引呢?
发布于 2020-08-10 07:35:30
查看迭代器切片中每对连续项的另一种方法
fn find_non_consecutive(a: &[i32]) -> Option<i32> {
a.windows(2).find(|x| x[0] + 1 != x[1]).map(|x| x[1])
}发布于 2020-08-10 01:28:22
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);
}发布于 2020-08-10 01:46:24
如果您查看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);
}在游乐场上看到它。
https://stackoverflow.com/questions/63332856
复制相似问题