代码出自 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()
}
理解上可能有误,还请大佬们指正,谢谢!
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.