首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >克隆HashMap<Weak,Weak> as HashMap<Rc,Rc>

克隆HashMap<Weak,Weak> as HashMap<Rc,Rc>
EN

Stack Overflow用户
提问于 2021-11-04 18:13:42
回答 1查看 139关注 0票数 0

我想把HashMap<Weak, Weak>克隆成HashMap<Rc, Rc>

代码语言:javascript
复制
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

代码语言:javascript
复制
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)>>的冲突实现

EN

回答 1

Stack Overflow用户

发布于 2021-11-04 22:14:28

我得到的解决方案是将RcWeak包装成新类型,允许实现Hash。类型参数还需要绑定?Sized,否则我的特性(在本例中为Symbol)在RcCellWeakCell中不会是对象安全的。为了充分发挥作用,还必须像这样实现Eq

代码语言:javascript
复制
impl<T: ?Sized> Eq for RcCell<T> {
}
impl<T: ?Sized> Eq for WeakCell<T> {
}

hash()实现如下所示:

代码语言:javascript
复制
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参数。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69843946

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档