rust - 为什么在函数返回时从 `HashMap::get`借用还没有结束?

标签 rust lifetime

这是对我的问题的模拟,当借用结束得太晚时

use std::collections::HashMap;

struct Item {
    capacity: u64
}

struct Petrol {
    name: String,
    fuel: HashMap<&'static str, Item>
}

fn buy_gaz(p: &mut Petrol) {
   match p.fuel.get("gaz") {
      Some(gaz) => {
        fire_petrol(p); 
      }
      None => ()
   }
}

fn fire_petrol(p: &mut Petrol) {
    println!("Boom!");
    p.fuel.remove("gaz");
    p.fuel.remove("benzin");
}

fn main() {
    let mut bt = Petrol {
        name: "Britii Petrovich".to_string(),
        fuel: HashMap::new()
    };

    bt.fuel.insert("gaz", Item { capacity: 1000 });
    bt.fuel.insert("benzin", Item { capacity: 5000 });

    buy_gaz(&mut bt);
}

编译时我得到:

note: previous borrow of `p.fuel` occurs here; the immutable borrow prevents subsequent moves or mutable borrows of `p.fuel` until the borrow ends
match p.fuel.get("gaz") {
      ^~~~~~

为什么借用这么晚结束,而不是从 HashMap::get 退出?我该如何解决我的问题?

PS:我编辑了我的第一篇文章,将结构添加到 HashMap,因为下面的决定适用于简单类型(我认为具有默认的 Clone 特征),但不适用于自定义结构

最佳答案

如果您查看 documentation of HashMap::get 你可以看到,它返回一个 Option<&V> .对映射的引用允许您对 HashMap 进行零拷贝访问。缺点是,只要您有引用,就不能修改 HashMap ,因为这可能会使您的引用无效。

分支机构Some(gaz)导致绑定(bind)gaz有类型 &u64 ,其中引用指向您的 HashMap 。如果将其更改为 Some(&gaz)您会得到值的副本而不是引用,并且甚至可以在该分支内修改散列映射。

Minimal Example in Playpen

关于rust - 为什么在函数返回时从 `HashMap::get`借用还没有结束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29561696/

相关文章:

javascript - 在Nodejs中重新分配变量时,存储旧变量的内存会释放吗?

reference - 什么场景下优先使用不借用的API?

rust - 将数据附加到 Actix-web 中的代理响应

visual-studio-code - rust-analyzer 无法加载工作区 : "cargo" "--version" failed: program not found

rust - 如何在 read_to_string 更改为占用缓冲区后创建链接 API?

c++ - 在自己的初始化器中使用变量

rust - 缺少终身运营商

rust - 如何解析包含简单列表和键值列表(关联数组)的YAML

reference - 由于相互冲突的要求,无法推断借用表达式的适当生命周期

struct - 结构的所有字段的相同生命周期参数