[英]How to solve this unconstrained type parameter error in Rust
我有一個消息傳遞系統,想通用地解決所有問題。 消息可以發送給實體,實體可以處理消息。
// There are many messages that implement this trait
trait Message {
type Response;
}
// Messages can be sent to 'entities'
trait Entity {
type Error;
}
// Entities can implement handlers for specific messages
trait MessageHandler<M: Message>: Entity {
fn handle(
&mut self,
message: M,
) -> Result<M::Response, Self::Error>;
}
這將像這樣實現:
struct SimpleEntity;
impl Entity for SimpleEntity {
type Error = ();
}
struct SimpleMessage;
impl Message for SimpleMessage {
type Response = ();
}
impl MessageHandler<SimpleMessage> for SimpleEntity {
fn handle(
&mut self,
message: SimpleMessage,
) -> Result<(), ()> {
Ok(())
}
}
所有實體都存儲在一個系統中。 系統只能存儲一種類型的實體。 對於該類型具有的每個消息處理程序,都應該有一個send_message
function 來通用接收消息。
我想它可能看起來像這樣:
// A message system for one type of entity. This is an example. Normally there's all kinds of async multithreaded stuff here
struct MessageSystem<E: Entity> {
handlers: Vec<E>,
}
// For every message handler, we want to implement the send_message function
impl<M: Message, MH: MessageHandler<M>> MessageSystem<MH> {
pub fn send_message(&mut self, entity_id: (), message: M) -> Result<M::Response, MH::Error> {
unimplemented!();
}
}
然后可以這樣使用:
// Example usage
fn main() {
let mut system = MessageSystem { handlers: vec![SimpleEntity] };
system.send_message((), SimpleMessage).unwrap();
}
但是,這會在send_message
function 的 impl 塊中產生編譯錯誤:
error[E0207]: the type parameter `M` is not constrained by the impl trait, self type, or predicates
--> src/lib.rs:25:6
|
25 | impl<M: Message, MH: MessageHandler<M>> MessageSystem<MH> {
| ^ unconstrained type parameter
error: aborting due to previous error
For more information about this error, try `rustc --explain E0207`.
我怎樣才能使這項工作?
目標是擁有這些不同的消息結構,讓它們由實體可以實現的處理程序處理,並通過系統結構將消息發送到實體。
一個明顯的事情是使消息成為MessageHandler
特征中的關聯類型,但是您不能為實體實現它的多個版本。
由於M
對send_message
是通用的,但不是MessageSystem
trait 本身,因此將其移動到send_message
function,並將綁定到方法的 trait 移動。
impl<MH: Entity> MessageSystem<MH> {
pub fn send_message<M>(&mut self, entity_id: (), message: M) -> Result<M::Response, MH::Error>
where
M: Message,
MH: MessageHandler<M>,
{
unimplemented!();
}
}
您的原始錯誤發生是因為您有一個特征不使用的通用參數,這意味着它是模糊的並且無法選擇正確的 impl。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.