Почему замыкание, переданное в map(), не принимает ссылку, в то время как замыкание, переданное в filter(), принимает ссылку?

#rust #reference #iterator #closures #ownership

#Ржавчина #ссылка #итератор #замыкания #владение

Вопрос:

Замыкание, переданное в map() , не принимает ссылку, в то время как переданное filter() принимает ссылку в Rust. Большинство адаптеров итератора принимают ссылку. Есть ли какая-либо причина map() , по которой не принимает ссылку в Rust?

 let a = (0..3).map(|x| x*2);
for i in a {
    println!("map i = {}", i);
}

let a = (0..3).filter(|amp;x| x % 2 == 0);
for i in a {
    println!("filter i = {}", i);
}
 

Ответ №1:

.map(<closure>) и .filter(<closure>) имеют разные применения.

.map(<closure>) предоставляет право собственности на элементы итератора замыканию, чтобы они могли быть преобразованы в новые элементы, которые затем возвращаются замыканием.

Однако .filter(<closure>) возвращает исходные элементы, когда предикат замыкания принимает значение true . Таким образом, он не может передать право собственности на элементы замыканию, поэтому он должен передавать элементы по ссылке.