如何解决Rust中的这种无约束类型参数错误

如何解决Rust中的这种无约束类型参数错误,rust,Rust,我有一个消息传递系统,希望能解决所有问题。 消息可以发送到实体,实体可以处理消息 //有许多消息实现了这个特性 特征信息{ 类型反应; } //消息可以发送到“实体” 特征实体{ 类型错误; } //实体可以实现特定消息的处理程序 trait-MessageHandler:Entity{ fn手柄( &莫特·赛尔夫, 信息:M, )->结果; } 这将按如下方式实施: struct SimpleEntity; simplentity的impl实体{ 类型错误=(); } 结构简单消息; Sim

我有一个消息传递系统,希望能解决所有问题。 消息可以发送到实体,实体可以处理消息

//有许多消息实现了这个特性
特征信息{
类型反应;
}
//消息可以发送到“实体”
特征实体{
类型错误;
}
//实体可以实现特定消息的处理程序
trait-MessageHandler:Entity{
fn手柄(
&莫特·赛尔夫,
信息:M,
)->结果;
}
这将按如下方式实施:

struct SimpleEntity;
simplentity的impl实体{
类型错误=();
}
结构简单消息;
SimpleMessage的impl消息{
类型响应=();
}
SimpleEntity的impl MessageHandler{
fn手柄(
&莫特·赛尔夫,
信息:SimpleMessage,
)->结果{
好(())
}
}
所有实体都存储在一个系统中。系统只能存储1种类型的实体。对于该类型具有的每个消息处理程序,都应该有一个
send\u message
函数,该函数一般接收消息

我想它可能是这样的:

//一种实体类型的消息系统。这是一个例子。通常这里有各种异步多线程的东西
结构消息系统{
主持人:Vec,,
}
//对于每个消息处理程序,我们都希望实现send_message函数
impl消息系统{
pub fn send_message(&mut self,entity_id:(),message:M)->Result{
未执行!();
}
}
然后可以这样使用:

//示例用法
fn main(){
让mut system=MessageSystem{handlers:vec![simplentity]};
system.send_message((),SimpleMessage).unwrap();
}
但是,这在
send_message
函数的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`.
error[E0207]:类型参数'M'不受impl-trait、self-type或谓词的约束
-->src/lib.rs:25:6
|
25 | impl消息系统{
|^无约束类型参数
错误:由于上一个错误而中止
有关此错误的详细信息,请尝试“rustc--explain E0207”。

我怎样才能做到这一点

目标是让这些不同的消息结构,由实体可以实现的处理程序处理,并通过系统结构将消息发送给实体


一件显而易见的事情是在
MessageHandler
trait中使消息成为一个关联类型,但是您不能为一个实体实现它的多个版本。

因为
M
send\u message
的泛型,而不是
MessageSystem
trait本身,所以将它移动到
send\u message
函数,并将特性绑定到方法

impl消息系统{
pub fn send_message(&mut self,entity_id:(),message:M)->Result
哪里
M:留言,
MH:MessageHandler,
{
未执行!();
}
}


您最初的错误发生是因为您有一个trait没有使用的泛型参数,这意味着它很模糊,无法选择正确的impl。

MH:MessageHandler
中的impl泛型不知道
send\u message
中的
M,这不应该引起错误吗?@Mihir我没有注意到,但我已经编辑过了我修改了帖子,使它现在可以工作了。是的,工作得很好!出于某种原因,我认为这不适用于函数本身的边界。非常感谢!