繁体   English   中英

当 Hash + PartialEq 是 Supertraits 时,无法使特征 Object 安全

[英]Trait can't be made Object Safe when Hash + PartialEq are Supertraits

我是 Rust 的新手,所以这可能是一个简单的问题。

我正在尝试为 Handlers 创建一个小型注册表,它应该返回任何实现TransferObject Trait 的结构:

pub trait TransferObject: Hash + PartialEq {}

由于我存储了在HashMap中注册的处理程序,因此 Trait 需要HashPartialEq作为 Supertraits:

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

但是在 Struct 中我得到了错误,因为PartialEq使用参数Self ,所以TransferObject不能变成 Object 。 我已经尝试过这样做:

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

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

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

但是,您的问题掩盖了使您陷入困境的误解:

由于我存储在HashMap中注册的处理程序,因此 Trait 需要HashPartialEq作为 Supertraits

这仅适用于您用作的东西。 没有这样的限制。

因此,您可以从此特征中删除超级特征HashPartialEq 相反,您需要将HashPartialEqEq添加到RequestMethod#[derive]宏中,因为这就是您用作密钥的内容。

最后,您确实需要Box来保存dyn TransferObject值以给它们一个已知的大小。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM