gpt4 book ai didi

rust - 将键插入 HashMap 后如何保留对键的引用?

转载 作者:行者123 更新时间:2023-11-29 08:20:13 25 4
gpt4 key购买 nike

我想插入到一个 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));

但这需要克隆。

这个在 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));

如何使用 Rust 1.2.0 完成此操作?

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

最佳答案

简短的回答是你不能。当您向 HashMap 中插入内容时,您就转移了所有权。这样做会使您可能对 key 的任何引用无效,因为 key 已移动到映射分配的内存中。

RFC 1194 (Set Recovery)提出了一种获取对 HashSet(而非映射)存储的 key 的引用的方法。还需要进一步的信息和研究来证明对 HashMap 也支持这一点。但是,这仍然无法帮助您,因为您需要知道 key (或可用于查找它的东西)才能再次查找它。但是,此时您已经将 key 放入集合中。

您的第二个解决方案之所以有效,是因为您实际上并未将 String 的所有权赋予 map ,而是赋予它一种类型的所有权,该类型通过引用计数对共享所有权进行建模。 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);
}

一些不稳定的功能可能会对您有所帮助。最有效的是 HashMap::raw_entry_mut :

#![feature(hash_raw_entry)]

use std::collections::HashMap;

fn main() {
let mut map = HashMap::new();
let id = "data";

let (k, _v) = map
.raw_entry_mut()
.from_key(id)
.or_insert_with(|| (String::from(id), 0));

println!("{:?}", k);
}

一个更短但效率稍低的解决方案使用 Entry::insert

#![feature(entry_insert)]

use std::collections::HashMap;

fn main() {
let mut map = HashMap::new();
let id = "data";

let entry = map.entry(String::from(id)).insert(0);
let k = entry.key();

println!("{:?}", k);
}

另见:

关于rust - 将键插入 HashMap 后如何保留对键的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55762906/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com