簡體   English   中英

如何解決 Rust 中的這種無約束類型參數錯誤

[英]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特征中的關聯類型,但是您不能為實體實現它的多個版本。

由於Msend_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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM