我想把HashMap<Weak, Weak>克隆成HashMap<Rc, Rc>
type RcCell<T> = Rc<RefCell<T>>;
type WeakCell<T> = Weak<RefCell<T>>;
type SymbolRef = RcCell<Symbol>;
type WeakSymbolRef = WeakCell<Symbol>;
struct S {
_some_list: Option<HashMap<WeakSymbolRef, WeakSymbolRef>>,
}
impl Symbol for RcCell<S> {
fn some_list(&self) -> HashMap<SymbolRef, SymbolRef> {
if let Some(ls) = self.borrow()._some_list {
ls.iter().map(|(k, v)| (k.upgrade().unwrap(), v.upgrade().unwrap())).collect()
} else {
HashMap::new()
}
}
}collect()在以下方面失败:
性状约束
std::cell::RefCell<(dyn symbols::Symbol + 'static)>: std::hash::Hash不满意 属性std::hash::Hash不是为std::cell::RefCell<(dyn symbols::Symbol + 'static)>实现的
在本例中,我期望Rc使用其内部指针进行散列。有什么替代iter().map().collect()的方法吗?还是有替代HashMap的方法
基于users.rust-lang.org,我尝试为SymbolRef实现Hash
use std::hash::{Hash, Hasher};
impl Hash for SymbolRef {
fn hash<H: Hasher>(&self, state: &mut H) {
std::ptr::hash(&**self, state)
}
}但是Rustc抱怨道:
用于类型
std::hash::Hash的特征std::rc::Rc<std::cell::RefCell<(dyn symbols::Symbol + 'static)>>的冲突实现
发布于 2021-11-04 22:14:28
我得到的解决方案是将Rc和Weak包装成新类型,允许实现Hash。类型参数还需要绑定?Sized,否则我的特性(在本例中为Symbol)在RcCell或WeakCell中不会是对象安全的。为了充分发挥作用,还必须像这样实现Eq:
impl<T: ?Sized> Eq for RcCell<T> {
}
impl<T: ?Sized> Eq for WeakCell<T> {
}hash()实现如下所示:
use std::hash::{Hash, Hasher};
impl<T: ?Sized> Hash for RcCell<T> {
fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
std::ptr::hash(Rc::as_ptr(&self._rc), state)
}
}不过,这对于crates.io上的一个板条箱来说会更好。这里有rccell,但它不使用?Sized参数。
https://stackoverflow.com/questions/69843946
复制相似问题