Я пытаюсь написать программу, которая включает в себя фильтрацию и складывание по массивам. Я использую Язык программирования ржавчины, первый вариант в качестве ссылки, но я не понимаю, что происходит, когда я формирую итераторы по массивам, Вот пример:
fn compiles() {
let range = (1..6);
let range_iter = range.into_iter();
range_iter.filter(|&x| x == 2);
}
fn does_not_compile() {
let array = [1, 4, 3, 2, 2];
let array_iter = array.into_iter();
//13:34 error: the trait `core::cmp::PartialEq<_>` is not implemented for the type `&_` [E0277]
array_iter.filter(|&x| x == 2);
}
fn janky_workaround() {
let array = [1, 4, 3, 2, 2];
let array_iter = array.into_iter();
// Note the dereference in the lambda body
array_iter.filter(|&x| *x == 2);
}
В первой функции я следую за тем, что итератор по диапазону не переходит в собственность, поэтому я должен взять &x
в filter
лямбда, но я не понимаю, почему второй пример с массивом ведет себя по-разному.