Rust 对重叠特征调用函数,关联类型不带;其中;约束

Rust 对重叠特征调用函数,关联类型不带;其中;约束,rust,Rust,我有两个相关类型的重叠特征。假设这些类型的对象是同一个对象,我想用关联类型作为参数从一个trait调用另一个trait的函数。下面的工作代码描述了我的意图 虽然这段代码可以工作,但where绑定使得代码库中的其他trait实现相当复杂有没有一种方法可以在没有(任何)where约束的情况下实现此结果? #![特征(关联类型默认值)] //模块A // //模块A中可对实体执行的操作的高级定义 // 特征操作:RPC{} //TODO:有没有办法消除这些where约束? trait-Actiona

我有两个相关类型的重叠特征。假设这些类型的对象是同一个对象,我想用关联类型作为参数从一个trait调用另一个trait的函数。下面的工作代码描述了我的意图

虽然这段代码可以工作,但where绑定使得代码库中的其他trait实现相当复杂有没有一种方法可以在没有(任何)where约束的情况下实现此结果?

#![特征(关联类型默认值)]
//模块A
// 
//模块A中可对实体执行的操作的高级定义
//
特征操作:RPC{}
//TODO:有没有办法消除这些where约束?
trait-Actionable:RPCable其中::RPC:Action{
类型动作:动作;
//理想情况下,我会在这里使用“action:Self::action”
fn调用(&self,操作:self::RPC){
//演员是什么样的

可能相关:


感谢@trentcl指出,提供的代码实际上是在没有where绑定的情况下工作的。我一定是在发布到这里之前做了一个意外的更改,突然使它工作了。对它的功能感到惊讶,我再次查看了我的代码库,看看出了什么问题

我的代码期望
Action
作为更高一级的参数,但由于它是一个关联类型,因此无法与
RPC
匹配。我需要提供一个where绑定,比如
where Actionable
,但这会导致循环特征依赖性问题,因为
Actionable
RPCable
都是alwas最后,我发现在最高级别上,如果操作实际存储在结构中,我可以通过如下操作将其强制转换为RPC,而无需where绑定:

struct Diff{
行动:行动
}
impl DiffTrait for Diff{
类型对象:可操作;
fn操作(&self)->&::操作{
&自我行动
}
fn rpc(&self)->&::RPCObject{
&自我行动
}
}
之后,我可以为不同的参数类型调用使用正确的变量


谢谢!

您提供的游乐场在删除
where
子句后编译良好,没有其他更改。我看到您希望使用
Self::Action
而不是
Self::RPC
。但是要使其工作
Self::Action
Self::RPC
必须是相同的类型,而不仅仅是实现相同的trait.也许
trait activatable:RPCable
是你要找的?虽然我不得不质疑拥有两个相同的特征是否明智,其中一个特征以这种方式依赖于另一个……似乎其中一个应该是标记特征。比如
Iterator
FusedIterator
你能提供一个例子,说明约束使你你的代码情结?