当 Hash + PartialEq 是超级特征时,特征不能成为对象安全的
Trait can't be made Object Safe when Hash + PartialEq are Supertraits
我是 Rust 的新手,所以这可能是一个简单的问题。
我正在尝试为处理程序创建一个小型注册表,它应该 return 实现 TransferObject
特征的任何结构:
pub trait TransferObject: Hash + PartialEq {}
因为我存储了在 HashMap
中注册的处理程序,所以 Trait 需要 Hash
和 PartialEq
作为 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=].
因此,您可以从此特征中删除超级特征 Hash
和 PartialEq
;相反,您需要将 Hash
、PartialEq
和 Eq
添加到 RequestMethod
的 #[derive]
宏中,因为这就是您用作键的内容。
最后,您确实需要 Box
来保存 dyn TransferObject
值以给它们一个已知的大小。
我是 Rust 的新手,所以这可能是一个简单的问题。
我正在尝试为处理程序创建一个小型注册表,它应该 return 实现 TransferObject
特征的任何结构:
pub trait TransferObject: Hash + PartialEq {}
因为我存储了在 HashMap
中注册的处理程序,所以 Trait 需要 Hash
和 PartialEq
作为 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 theHash
andPartialEq
as the Supertraits
这仅适用于您用作 keys 的东西。 values[= 没有这样的限制41=].
因此,您可以从此特征中删除超级特征 Hash
和 PartialEq
;相反,您需要将 Hash
、PartialEq
和 Eq
添加到 RequestMethod
的 #[derive]
宏中,因为这就是您用作键的内容。
最后,您确实需要 Box
来保存 dyn TransferObject
值以给它们一个已知的大小。