Vic*_*mov 5 smart-pointers hashset rust borrowing
我正在缓存来自 a 中输入的单词HashSet<Rc<String>>。在检查它是否包含在集合中时,我可以以某种方式用作&str该集合的键吗HashSet<String>?
使用 a HashSet<String>,它的工作原理:
use std::rc::Rc;
use std::collections::HashSet;
let input = "";
let string = input.to_string();
let rc_string: Rc<String> = Rc::new(string.clone());
let set: HashSet<String> = [string.clone()].iter().cloned().collect();
assert!(set.contains(&string));
assert!(set.contains(input));
Run Code Online (Sandbox Code Playgroud)
但如果我尝试使用HashSet<Rc<String>>:
let string_cache: HashSet<Rc<String>> = [rc_string.clone()].iter().cloned().collect();
assert!(string_cache.contains(&rc_string));
assert!(string_cache.contains(&string));
assert!(string_cache.contains(input));
Run Code Online (Sandbox Code Playgroud)
然后我得到这个错误:
use std::rc::Rc;
use std::collections::HashSet;
let input = "";
let string = input.to_string();
let rc_string: Rc<String> = Rc::new(string.clone());
let set: HashSet<String> = [string.clone()].iter().cloned().collect();
assert!(set.contains(&string));
assert!(set.contains(input));
Run Code Online (Sandbox Code Playgroud)
正如错误消息所述,HashSet::contains要求存储在集合中的项目的类型具有Borrow其参数类型的实现。没有Borrow<str>for的实现Rc<String>。
您无法自己添加此实现,因为所涉及的类型和特征都不是来自您的板条箱。但是,您可以为您可能需要Rc<String>的任何实现创建一个新类型包装器并实现Borrow:
#[derive(Debug, Eq, PartialEq, Hash)]
struct CacheItem(Rc<String>);
impl Borrow<str> for CacheItem {
fn borrow(&self) -> &str {
&self.0
}
}
impl Borrow<String> for CacheItem {
fn borrow(&self) -> &String {
&self.0
}
}
impl Borrow<Rc<String>> for CacheItem {
fn borrow(&self) -> &Rc<String> {
&self.0
}
}
let string_cache: HashSet<CacheItem> = [rc_string.clone()].iter().cloned().map(CacheItem).collect();
assert!(string_cache.contains(&rc_string));
assert!(string_cache.contains(&string));
assert!(string_cache.contains(input));
Run Code Online (Sandbox Code Playgroud)
像这样构建的新型包装器应该具有零运行时间成本。但是,您可能需要添加一些额外的特征实现才能方便地使用它。
| 归档时间: |
|
| 查看次数: |
885 次 |
| 最近记录: |