#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 . Таким образом, он не может передать право собственности на элементы замыканию, поэтому он должен передавать элементы по ссылке.