Rust 无法使用entry API使用引用作为函数内部的键来修改HashMap

Rust 无法使用entry API使用引用作为函数内部的键来修改HashMap,rust,hashmap,borrow-checker,Rust,Hashmap,Borrow Checker,我试图获取可变HashMap引用中元素的句柄,其中键是&str 在下面的示例中,我试图获取valuedict[key],以便对其进行变异。我该怎么做 我试过: dict.entry(键):生存期不匹配 dict.entry(&String::from(key)):借来的值寿命不够长 e、 g.这: use std::collections::HashMap; fn do_thing(key: &str, dict: &mut HashMap<&str, u32

我试图获取可变
HashMap
引用中元素的句柄,其中键是
&str

在下面的示例中,我试图获取value
dict[key]
,以便对其进行变异。我该怎么做

我试过:

  • dict.entry(键)
    :生存期不匹配
  • dict.entry(&String::from(key))
    :借来的值寿命不够长
e、 g.这:

use std::collections::HashMap;

fn do_thing(key: &str, dict: &mut HashMap<&str, u32>) -> u32 {
    let num = dict.entry(&String::from(key)).or_insert(0);
    *num += 1;
    return 42;
}
使用std::collections::HashMap;
fn do_thing(key:&str,dict:&mut HashMap)->u32{
设num=dict.entry(&String::from(key))。或_insert(0);
*num+=1;
返回42;
}
出现以下错误:

错误[E0716]:借用时丢弃的临时值
-->src/lib.rs:4:27
|
3 | fn do_thing(key:&str,dict:&mut HashMap)->u32{
|-我们将此引用的生存期称为“1”`
4 | let num=dict.entry(&String::from(key))。或_insert(0);
|--------------本语句末尾将释放临时值
|               |           |
||创建仍在使用时释放的临时
|参数要求借用持续时间为“%1”`

键的生存期
参数链接到
哈希映射中键的生存期

use std::collections::HashMap;

fn do_thing<'a>(key: &'a str, dict: &mut HashMap<&'a str, u32>) -> u32 {
    *dict.entry(key).or_insert(0) += 1;
    42
}
错误[E0623]:生存期不匹配
-->src/lib.rs:4:17
|
3 | fn do_thing(key:&str,dict:&mut HashMap)->u32{
|                  ----                     ----
|                  |
|这两种类型的声明具有不同的生存期。。。
4 |*输入(键)或插入(0)+=1;
|^^^……但是来自'key'的数据在这里流入'dict'
具体来说,
entry
key
存储在
HashMap
中,但是
key
引用的值在
HashMap
之前可能会变得无效。如果发生这种情况,
HashMap
将包含一个悬空引用,指向无效内存。这正是Rust的b腐蚀检测器防止腐蚀

另见:

dict.entry(&String::from(key))

出于同样的原因,这在这里是行不通的

另见:

@Shepmaster编辑得很好——现在问题更清楚了。
use std::collections::HashMap;

fn do_thing(key: &str, dict: &mut HashMap<&str, u32>) -> u32 {
    *dict.entry(key).or_insert(0) += 1;
    42
}