rust的map遍历时k/v分别是什么类型的?

代码如下

map_internal: RwLock<HashMap<Pubkey,AccountMapEntry<T>>>,
        let mut updates = Vec::default();
        {
            let map = self.map_internal.read().unwrap();
            for (k, v) in map.iter() {
                if v.dirty() {
                    updates.push((*k, Arc::clone(v)));
                }
            }
        }

Arc::clone(v)我可以理解为v是一个Arc?

为什么要用*k而不是k

阅读 2.5k
3 个回答

代码好像有点问题A Maybe

  • 使用Arc::clone(v) 要求v是 Arc(v); map类型是RwLock<HashMap<Pubkey,Arc<AccountMapEntry<T>>>>, 所以这里直接写成 Arc::clone(v) 编译不会通过
  • 一般 *k和 k 都是可以的;看你需求;如果是*k,updates类型是Pubkey,如果是k,updates类型是&Pubkey

在Rust中,for..in 循环通过调用 Iterator trait 中的 next() 方法,读取集合类型中下一个值并将其赋值给一个变量。一旦所有的值都被迭代完毕,循环将自动结束。

在我的问题中,map的类型是&HashMap<Pubkey,AccountMapEntry<T>>
而map.iter()将返回一个迭代器std::collections::hash_map::Iter
其next方法签名为fn next(&mut self) -> Option<(&'a K, &'a V)>

所以,k是&Pubkey类型,v是&AccountMapEntry<T>类型

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进