如何在将密钥插入HashMap后保留对密钥的引用?

Mic*_*den 6 rust

我想插入一个HashMap,但保持一个不可变的借用密钥传递到地方.在我的情况下,键是字符串.

这是一种方式:

use std::collections::HashMap;
let mut map = HashMap::new();
let id = "data".to_string();  // This needs to be a String
let cloned = id.clone();

map.insert(id, 5);

let one = map.get(&cloned);
let two = map.get("data");
println!("{:?}", (one, two));
Run Code Online (Sandbox Code Playgroud)

但这需要克隆.

这个工作直到Rust 1.2.0:

use std::collections::HashMap;
use std::rc::Rc;
use std::string::as_string;

let mut map = HashMap::new();
let data = Rc::new("data".to_string()); // This needs to be a String
let copy = data.clone();
map.insert(data, 5);

let one = map.get(&copy);
let two = map.get(&*as_string("data"));
println!("{:?}", (one, two));
Run Code Online (Sandbox Code Playgroud)

如何使用Rust 1.2.0实现此目的?

理想情况下,我希望将一个键放入HashMap,但保留对它的引用,并允许我使用&str类型访问其中的元素,而无需额外分配.

She*_*ter 11

简短的回答是,你做不到.当您插入内容时HashMap,您将转移所有权.这样做会使您对密钥的任何引用无效,因为密钥将移动到映射分配的内存中.

接受的RFC 1194提出了一种方法来获取由HashSet(不是映射)存储的密钥的引用.需要进一步的信息和研究来证明支持这一点HashMap.但是,这仍然无法帮助您,因为您需要知道密钥(或可以用来查找它的东西)才能再次查找它.但是,您已经将密钥放在集合中.

您的第二个解决方案是有效的,因为您实际上并没有String将地图的所有权授予地图,而是通过引用计数为其提供模型共享所有权的类型的所有权.该clone调用只是递增引用计数,而这个模型如何了很多动态语言将解决这个问题.

use std::collections::HashMap;
use std::rc::Rc;

fn main() {
    let mut map = HashMap::new();
    let data = Rc::new("data".to_string());
    map.insert(data.clone(), 5);

    let v = map.get(&data);
    println!("{:?}", v);
}
Run Code Online (Sandbox Code Playgroud)

  • 添加返回对新插入数据的引用的“fn insert_and_get(&mut self, value: T) -> &T”在技术上会困难或不可能吗? (3认同)