В следующем фрагменте я не понимаю, почему замыкание берет свой параметр s
по ссылке (&s
), а затем разыменовывает его (*s
):
fn main() {
let needle = "list".to_string();
let haystack = [
"some".to_string(),
"long".to_string(),
"list".to_string(),
"of".to_string(),
"strings".to_string(),
].to_vec();
if let Some(str) = haystack.iter().find(|&s| *s == needle) {
println!("{}", needle);
} else {
println!("Nothing there...");
}
}
Я упускаю что-то очевидное?
||
, отсутствиеreturn
, тот факт, чтоneedle
не захватывается явно (так как же захватывать по ссылке или по значению),... - person Matthieu M.   schedule 01.03.2019find(|&s| s == &needle)
выглядит хорошо для меня - person Boiethios   schedule 01.03.2019if haystack.contains(&needle)
более идиоматично дляVec
- person Stargateur   schedule 01.03.2019find()
принимает ссылку, а многие итераторы перебирают ссылки, это может привести к запутанной ситуации, когда аргумент является двойной ссылкой. Вы можете увидеть этот эффект в приведенных ниже примерах с&&x
. - person Shepmaster   schedule 01.03.2019