Rust 如何返回实现“读”和“写”特征的泛型类型的结构?

Rust 如何返回实现“读”和“写”特征的泛型类型的结构?,rust,Rust,我试图将TcpStream和TlsStream封装在一个对象中,以便使用一个结构与它们中的任何一个进行接口。我试图根据一个配置值将io方法委托给一个或另一个,但不知道如何返回具有实现读写特性的泛型类型的结构 我的代码如下 pub struct TcpStream<T: Read + Write> { io_delegate: T, config: Config, } impl<T> TcpStream<T> where T: Read

我试图将TcpStream和TlsStream封装在一个对象中,以便使用一个结构与它们中的任何一个进行接口。我试图根据一个配置值将io方法委托给一个或另一个,但不知道如何返回具有实现读写特性的泛型类型的结构

我的代码如下

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,但实现忽略了这一点并返回一个具体类型。