- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想插入到一个 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(©);
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/32401857/
我有不同的结构,它们都包含一个 HashMap与 String作为键,但具有不同的值类型。例如,一个结构有一个类型为 HashMap 的成员, 另一个将有一个 HashMap 类型的成员, 等等。 我
我想制作一个包含学生姓名和科目的板,每个学生在每个科目中都有一个成绩(或者没有..他可以离开考试而不写,然后他的案子将是空的)。我只想使用 HashMap。我的意思是,它会是这样的: HashMap>
是否有内存和速度高效的方法来在 HashMap 中动态存储唯一键:值对? key 保证是唯一的,但它们的数量经常变化。插入和删除必须很快。 我所做的是包含有符号距离场的八叉树(非线性/完整)。八叉树经
有谁知道为什么选择通过 LinkedList 而不是另一个 Hashmap 来实现 HashMap 的存储桶。如果桶本身变成了 HashMap,那么 contains 或 get 的时间复杂度似乎是
我想创建一个具有嵌套结构的 HashMap,就像这个复杂的示例: { type: boy name: Phineas father: type: man
这个问题在这里已经有了答案: How do I create a global, mutable singleton? (7 个答案) 关闭 7 年前。 我想要一个可扩展的字典,将 Object 与
HashMap> hm = new HashMap>(); hm.put("Title1","Key1"); for(int i=0;i hm1 = new H
我必须修改当前代码以适应 Spring MVC。我有 HashMap hashmap = new HashMap(); request.setAttribute("dslrErrors", hashm
我正在尝试进行一些错误捕获。 错误应该检查数组的长度是否小于 2,并检查 HashMap 是否包含用户输入的键。 捕获的错误必须仅使用 if 语句,并且必须使用 .length() 方法,并且必须使用
在 stackoverflow 上提出另一个问题后,(Java- Why this program not throwing concurrent Modification exception)我开始
我有两个类,想使用 org.dozer.Mapper( http://dozer.sourceforge.net/ ) 将 Female 对象的属性映射到 Male 对象。 第一类是: public
As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be
是否有任何方法可以检查 HashMap 是否包含一组特定的键(这些键是在数组中给出的)。当我尝试类似下面的代码时,它返回 false。 map.containsKey(arrayOf("2018-01
跟进我的问题:How To Access hash maps key when the key is an object 我想尝试这样的事情:webSearchHash.put(xfile.getPa
我有一个可扩展的 ListView ,对于每个 child ,我需要有 4 个“额外”或字符串或其他名称来调用它:- 子标题- 描述- 链接1- 链接2 跟着教程,创建 ListView 、不同的 p
我想确保这是正确的,因为如果不正确,它可能会破坏我的应用程序。 我有这个: private static HashMap> balance = new HashMap<>(); 如果我得到这样的值:
我想做以下事情: 为某个键查找Vec,并将其存储以备后用。 如果它不存在,则为键创建一个空的 Vec,但仍将其保存在变量中。 如何有效地做到这一点?自然地,我认为我可以使用 match: use st
我想做以下事情: 为某个键查找Vec,并将其存储以备后用。 如果它不存在,则为键创建一个空的 Vec,但仍将其保存在变量中。 如何有效地做到这一点?自然地,我认为我可以使用 match: use st
我想做以下事情: 为某个键查找Vec,并将其存储以备后用。 如果它不存在,则为键创建一个空的 Vec,但仍将其保存在变量中。 如何有效地做到这一点?自然地,我认为我可以使用 match: use st
我想做以下事情: 为某个键查找Vec,并将其存储以备后用。 如果它不存在,则为键创建一个空的 Vec,但仍将其保存在变量中。 如何有效地做到这一点?自然地,我认为我可以使用 match: use st
我是一名优秀的程序员,十分优秀!