相关疑难解决方法(0)

如何有效地从HashMap中查找和插入?

我想做以下事情:

  • 查找Vec某个键,并将其存储起来供以后使用.
  • 如果它不存在,Vec则为该键创建一个空,但仍将其保留在变量中.

如何有效地做到这一点?当然我以为我可以使用match:

use std::collections::HashMap;

// This code doesn't compile.
let mut map = HashMap::new();
let key = "foo";
let values: &Vec<isize> = match map.get(key) {
    Some(v) => v,
    None => {
        let default: Vec<isize> = Vec::new();
        map.insert(key, default);
        &default
    }
};
Run Code Online (Sandbox Code Playgroud)

当我尝试它时,它给了我错误,如:

error[E0502]: cannot borrow `map` as mutable because it is also borrowed as immutable
  --> src/main.rs:11:13
   |
7  |     let values: &Vec<isize> = match map.get(key) {
   |                                     --- immutable borrow occurs …
Run Code Online (Sandbox Code Playgroud)

lookup hashmap rust

83
推荐指数
1
解决办法
1万
查看次数

在HashMap-value之后匹配比克隆它更优雅的方式

我正在使用Rust编程语言学习Rust .我在处理闭包章节中正在处理以下任务:

尝试修改Cacher以保存哈希映射而不是单个值.哈希映射的键将arg是传入的值,并且哈希映射的值将是在该键上调用闭包的结果.值函数不会查看是否self.value直接具有值SomeNone值,而是arg在哈希映射中查找并返回值(如果存在).如果它不存在,Cacher则将调用闭包并将结果值保存在与其arg值相关联的哈希映射中.

这是我的解决方案:

use std::collections::HashMap;

struct Cacher<T>
where
    T: Fn(i32) -> i32,
{
    calculation: T,
    values: HashMap<i32, i32>,
}

impl<T> Cacher<T>
where
    T: Fn(i32) -> i32,
{
    fn new(calculation: T) -> Cacher<T> {
        Cacher {
            calculation,
            values: HashMap::new(),
        }
    }
    fn value(&mut self, arg: i32) -> i32 {
        match self.values.get(&arg) {
            Some(v) => *v,
            None => { …
Run Code Online (Sandbox Code Playgroud)

hash caching rust

5
推荐指数
0
解决办法
408
查看次数

如何解决自我借用地图.or_insert_with?锈(1.11)

这个片段

use std::collections::HashMap;

struct Foo {
    local_ids: HashMap<i32, i32>,
    last_id: i32,
}

impl Foo {
    fn foo(&mut self, external_id: i32) {
        let id = self.local_ids
                     .entry(external_id)
                     .or_insert_with(||{self.last_id += 1; self.last_id});
    }
}
Run Code Online (Sandbox Code Playgroud)

不行,因为我们不能两次借自己

error: closure requires unique access to `self` but `self.local_ids` is already borrowed [E0500]
Run Code Online (Sandbox Code Playgroud)

这可以在没有第二次密钥查找的情况下修复吗?


这与Rust:HashMap在尝试实现查找或插入时借用问题非常相似,但API已经发生了很大变化.

来自上面的find_with_or_insert_with回答似乎没有映射到当前的api.

dictionary rust

4
推荐指数
1
解决办法
574
查看次数

在迭代器上调用map时如何消除部分移动

我有一个简单的(我认为应该是)任务来处理mapa 中包含的值Vec并生成另一个Vec

#[derive(Clone)]
struct Value(u32);
#[derive(Clone)]
struct Id(u32);

struct ValuesInfo {
    values: Vec<Value>,
    name: String,
    id: Id
}

struct ValueInfo{
    value: Value,
    name: String,
    id: Id
}

fn extend_values(v: Vec<ValuesInfo>) -> Vec<Vec<ValueInfo>> {
    v.into_iter().map(|values_info|{
        values_info.values.into_iter().map(|value|{
            ValueInfo{
                value,
                name: values_info.name.clone(),
                id: values_info.id.clone()
            }
        }).collect::<Vec<ValueInfo>>()
    }).collect::<Vec<Vec<ValueInfo>>>()
}
Run Code Online (Sandbox Code Playgroud)

游乐场永久链接

在这里我有一个部分移动错误看起来像

   Compiling playground v0.0.1 (/playground)
error[E0382]: borrow of moved value: `values_info`
   --> src/lib.rs:20:44
    |
20  |         values_info.values.into_iter().map(|value|{
    |                            -----------     ^^^^^^^ value borrowed here after partial move
    |                            | …
Run Code Online (Sandbox Code Playgroud)

collections rust borrow-checker

4
推荐指数
1
解决办法
463
查看次数