Rust 如何返回实现“读”和“写”特征的泛型类型的结构?
我试图将TcpStream和TlsStream封装在一个对象中,以便使用一个结构与它们中的任何一个进行接口。我试图根据一个配置值将io方法委托给一个或另一个,但不知道如何返回具有实现读写特性的泛型类型的结构 我的代码如下Rust 如何返回实现“读”和“写”特征的泛型类型的结构?,rust,Rust,我试图将TcpStream和TlsStream封装在一个对象中,以便使用一个结构与它们中的任何一个进行接口。我试图根据一个配置值将io方法委托给一个或另一个,但不知道如何返回具有实现读写特性的泛型类型的结构 我的代码如下 pub struct TcpStream<T: Read + Write> { io_delegate: T, config: Config, } impl<T> TcpStream<T> where T: Read
pub struct TcpStream<T: Read + Write> {
io_delegate: T,
config: Config,
}
impl<T> TcpStream<T>
where T: Read + Write
{
pub fn connect<A: ToSocketAddrs>(config: Config, addr: A) -> io::Result<TcpStream<T>> {
let tcp_stream = net::TcpStream::connect(addr).unwrap();
if config.ssl {
let tls_stream = TlsConnector::builder()
.unwrap()
.build()
.unwrap()
.connect("rem", tcp_stream)
.unwrap();
return Ok(TcpStream {
config: config,
io_delegate: tls_stream,
});
}
return Ok(TcpStream {
config: config,
io_delegate: tcp_stream,
});
}
}
当我试图编译时,我得到以下错误
错误[E0308]:类型不匹配
->src/rem/tcp_stream.rs:19:23
|
19 |返回OkTcpStream{
|从这里开始。。。
20 | |配置:配置,
21 | | io|代表:tls|U流
22 | | };
||`
|
=注意:应为'rem::tcp_stream::TcpStream'类型`
找到类型'rem::tcp_stream::TcpStream'`
错误[E0308]:类型不匹配
->src/rem/tcp_stream.rs:24:19
|
24 |返回OkTcpStream{
|从这里开始。。。
25 | |配置:配置,
26 | | io|代表:tcp|U流
27 | | };
||`
|
=注意:应为'rem::tcp_stream::TcpStream'类型`
找到类型'rem::tcp_stream::TcpStream'`
有没有办法实现这类目标?我不确定这是否是最好的解决方案,但似乎确实有效 我创建了一个新特性,它是读+写的组合,然后将它作为一个框存储在我的结构中
trait ReadWrite : Read + Write {}
impl<T: Read + Write> ReadWrite for T {}
pub struct TcpStream{
io_delegate : Box<ReadWrite>,
config: Config
}
impl TcpStream {
pub fn connect<A: ToSocketAddrs>(config: Config, addr: A) -> TcpStream {
let tcp_stream = net::TcpStream::connect(addr).unwrap();
if config.ssl {
let tls_stream = TlsConnector::builder().unwrap().build().unwrap().connect("rem", tcp_stream).unwrap();
return TcpStream {
config: config,
io_delegate: Box::new(tls_stream)
};
}
return TcpStream{
config: config,
io_delegate:Box::new(tcp_stream)
};
}
}
如果您有兴趣返回一个trait,请参见@Shepmaster OP尝试在一个分支中返回TlsStream,在另一个分支中返回TcpStream,impl trait不会有帮助。与的关系相当微妙,虽然答案确实提到了特质对象,但导致错误的问题与此不同。@kennytm impl trait是第一个答案中的4种可能性之一;另一个是返回一个装箱的trait对象。返回一个装箱的trait对象就是OP所做的。我不清楚;为什么你认为它不是复制品?我看不出第二个问题有什么用处;这正是OP遇到的问题——函数说它返回调用者选择的任何T,但实现忽略了这一点并返回一个具体类型。