代码出自 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() } 理解上可能有误,还请大佬们指正,谢谢!
