当 Hash + PartialEq 是超级特征时,特征不能成为对象安全的

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

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

我正在尝试为处理程序创建一个小型注册表,它应该 return 实现 TransferObject 特征的任何结构:

pub trait TransferObject: Hash + PartialEq {}

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

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

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

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

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

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

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

Since I store the Handlers that are registered in a HashMap the Trait needs the Hash and PartialEq as the Supertraits

这仅适用于您用作 keys 的东西。 values[= 没有这样的限制41=].

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

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