代码出自 rustlings:
第一种:
fn count_iterator(map: &HashMap<String, Progress>, value: Progress) -> usize {
// 文档中说 iter 返回 (&'a K, &'a V),也就是 map 的 K 和 V 的引用组成的 tuple 。
// 然后这个 tuple 被 deconstruct 了,且 V move 给了 v ,顺带地 map 也被 move 了?
map.iter().filter(|(_, &v)| v == value).count()
}
第二种:
fn count_iterator(map: &HashMap<String, Progress>, value: Progress) -> usize {
// 无法理解为什么要 2 次 deref
map.iter().filter(|(_, v)| **v == value).count()
}
第三种:
fn count_iterator(map: &HashMap<String, Progress>, value: Progress) -> usize {
// 请问这里 value 也是 move 给了 v 吗?那和第一种的区别是?
map.iter().filter(|&(_, &v)| v == value).count()
}
第四种:
fn count_iterator(map: &HashMap<String, Progress>, value: Progress) -> usize {
// 首先 &(_, v) borrow map 的 (&'a K, &'a V),然后这个 tuple 被 deconstruct ,v 是
// &'a V ,所以 deref v 拿到值,从而和 value 参数的值进行比较
map.iter().filter(|&(_, v)| *v == value).count()
}
理解上可能有误,还请大佬们指正,谢谢!