我具有可读性和可写流的特征(例如TcpStream):

pub trait MyTraitPool<T: Read + Write> {
    fn acquire(&self, &String) -> T;
    fn free(&self, T);
}

我想用TcpStream作为T实现该特征,所以我想写
struct MyPool;

impl<T> MyTraitPool<T> for MyPool
    where T: Read + Write {

    fn acquire(&self, addr: &String) -> T {
        TcpStream::connect(addr.as_str()).unwrap()
    }

    fn free(&self, con: T) {
        con.shutdown(Shutdown::Both);
    }
}

我在std::net::TcpStream方法中收到错误“期望的类型参数,找到了struct acquire”。至于free方法,我知道shutdownTcpStream特定的,但是我想在那时拥有一个特定于TcpStream的实现,因此能够调用TcpStream特定的方法。那么我该怎么做呢?

附带说明:该实现只是我想做的事情的一个示例,而不是代码以后的操作方式的示例!

最佳答案

您无需将MyTraitPool特性设为通用,而是将MyPool特性设为通用,然后创建一个中间的MyStream特性以为您提供所需的所有方法:

trait MyStream: Read + Write {
    fn connect(&str) -> Self;
    fn shutdown(self);
}
impl MyStream for TcpStream {
    fn connect(addr: &str) -> Self { TcpStream::connect(addr) }
    fn shutdown(self) { TcpStream::shutdown(self, Shutdown::Both); }
}
impl<T: MyStream> MyTraitPool for MyPool<T> {
    fn acquire(&self, addr: &str) -> T {
        MyStream::connect(addr)
    }
    fn free(&self, con: T) {
        con.shutdown()
    }
}

实际上不需要关闭的流只会将实现留空。

关于types - 以特定的struct作为参数的Trait实现,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41980909/

10-15 09:55