In pattern matching, one can append &[&] [mut] to an identifier like &e in v.iter().filter(|&e| ...). This is called reference patterns.
When playing with this pattern, I found an inconsistent behavior:
For a doubly borrowed value,
&&eworks but&ealso works.When mutable, however,
&&mut eworks whilst&mut edoesn't work.
Why?
fn main() {
let mut v = vec![1, 2, 3, 4, 5];
v.iter()
.filter(|e| *e * 2 >= 8)
.for_each(|e| println!("{}", e)); //=> 4 5
v.iter()
.filter(|e| **e * 2 >= 8)
.for_each(|e| println!("{}", e));
v.iter()
.filter(|&e| e * 2 >= 8)
.for_each(|e| println!("{}", e));
v.iter()
.filter(|&&e| e * 2 >= 8)
.for_each(|e| println!("{}", e));
//NG
// v.iter_mut()
// .filter(|&mut e| e * 2 >= 8)
// .for_each(|e| println!("{}", e));
v.iter_mut()
.filter(|&&mut e| e * 2 >= 8)
.for_each(|e| println!("{}", e));
}