当 Hash + PartialEq 是 Supertraits 时,Trait 无法成为对象安全

2023-12-01

我对 Rust 还很陌生,所以这可能是一个简单的问题。

我正在尝试为处理程序创建一个小型注册表,该注册表应该返回实现以下功能的任何结构TransferObject Trait:

pub trait TransferObject: Hash + PartialEq {}

由于我将注册的处理程序存储在HashMap该特质需要Hash and PartialEq作为超级特质:

pub struct RequestHandlerRegistry {
    handlers: HashMap<RequestMethod, HashMap<String, RequestHandler<dyn TransferObject>>>,
}

但在结构中我得到了错误,那就是TransferObject不能成为一个对象,因为PartialEq使用参数Self。 我已经尝试过做这样的事情:

pub struct RequestHandlerRegistry {
    handlers: HashMap<RequestMethod, HashMap<String, RequestHandler<Box<dyn TransferObject>>>>,
}

但我仍然遇到同样的错误。
有什么办法可以解决这个问题吗?
我还创建了一个操场以便轻松重现错误。


这不起作用,因为PartialEq默认情况下意味着PartialEq<Self>。当使用动态调度时(dyn)没有足够的信息来了解什么Self是,因此什么类型的引用的方法PartialEq可以接受。

然而,你的问题掩盖了一个让你陷入困境的误解:

由于我将注册的处理程序存储在HashMap该特质需要Hash and PartialEq作为超级特质

这仅适用于您用作的东西keys.没有这样的限制values.

因此你可以放弃超级特质Hash and PartialEq从这个特点;相反你需要添加Hash, PartialEq, and Eq to the #[derive]宏对于RequestMethod,因为这就是您用作密钥的内容。

最后,你确实需要Box持有dyn TransferObject值给它们一个已知的大小。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当 Hash + PartialEq 是 Supertraits 时,Trait 无法成为对象安全 的相关文章

随机推荐