引用具有关联类型的通用特征作为结构域

时间:2019-08-30 08:39:28

标签: rust

我很难说服Rust接受对一个实例的引用,该实例实现了一个具有关联类型的通用特征作为struct字段的值。您能否提供一些线索,说明下面的代码出了什么问题。

trait TraitA{}

trait TraitB{
    type As: TraitA;
}

struct StructA;

impl TraitA for StructA{}

struct StructB;

impl TraitB for StructB{
    type As = StructA;
}

struct StructC<'a> {
    r: &'a (dyn TraitB<As = (dyn TraitA)> + 'a),
}


fn main(){
    let x = StructB;
    let z = StructC {
        r: &x,
    };
}

Playground

1 个答案:

答案 0 :(得分:1)

关于发布的编译器错误

引起的问题是TCPtransport未实现 Transport<.., Configuration=(dyn TransportConfiguration<SyncReq>>, 相反,它实现 Transport<.., Configuration=TcpTranportCfg>,以后不能将其强制转换为前者:

playground

可能的解决方案:添加新特征(基本上是删除关联的类型信息):

trait SyncReqTransport{
    ...
}

impl<T> SyncReqTransport<SyncReq> for T 
    where 
        T: Transport<SyncReq>, // I Removed other parameters for simplicity
        <T as Transport<SyncReq>>::Config: TransportConfiguration<SyncReq>
{
    ...
}

然后将DAG更改为

pub struct DAG<'a, T> {
    request_transport: &'a (dyn SyncReqTransport + 'a),
}

另一个问题

sr_transport是在堆栈上创建的,以后会从它返回对其的引用 创建的函数,这是非法的。