我很难说服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,
};
}
答案 0 :(得分:1)
引起的问题是TCPtransport
未实现
Transport<.., Configuration=(dyn TransportConfiguration<SyncReq>>
,
相反,它实现
Transport<.., Configuration=TcpTranportCfg>
,以后不能将其强制转换为前者:
可能的解决方案:添加新特征(基本上是删除关联的类型信息):
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
是在堆栈上创建的,以后会从它返回对其的引用
创建的函数,这是非法的。