Types 以特定结构为参数的Trait实现

Types 以特定结构为参数的Trait实现,types,rust,traits,Types,Rust,Traits,我对可读写流有一个特点(比如TcpStream): 我在acquire方法中得到错误“expected type parameter,found structstd::net::TcpStream”。至于free方法,我知道shutdown是特定于TcpStream的,但我希望在这一点上有一个特定于TcpStream的实现,因此能够调用特定于TcpStream的方法。那我该怎么做呢 作为旁注:实现只是我想做的事情的一个例子,而不是代码以后如何操作 不要让MyTraitPooltrait通用,而是

我对可读写流有一个特点(比如
TcpStream
):

我在
acquire
方法中得到错误“expected type parameter,found struct
std::net::TcpStream
”。至于
free
方法,我知道
shutdown
是特定于
TcpStream
的,但我希望在这一点上有一个特定于
TcpStream
的实现,因此能够调用特定于
TcpStream
的方法。那我该怎么做呢


作为旁注:实现只是我想做的事情的一个例子,而不是代码以后如何操作

不要让
MyTraitPool
trait通用,而是让您的
MyPool
通用,然后创建一个中间
MyStream
trait,为您提供所需的所有方法:

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()
    }
}
trait MyStream:读+写{
fn connect(&str)->Self;
fn关闭(自我);
}
针对TcpStream的impl MyStream{
fn connect(addr:&str)->Self{TcpStream::connect(addr)}
fn shutdown(self){TcpStream::shutdown(self,shutdown::Both);}
}
为MyPool安装MyTraitPool{
fn获取(&self,addr:&str)->T{
MyStream::connect(地址)
}
无fn(&self,con:T){
con.shutdown()
}
}

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

我遇到了不同的问题:“预期的类型参数,找到了enum
std::result::result
”(上面的代码中缺少一个
展开
)和“在当前范围内找不到类型
T
的名为
shutdown
的方法”(假设您只使用
std::net:{TcpStream,shutdown}
std::io:{Read,Write}
)。@ljedrz上面的实现只是一个示例,因此我没有检查返回类型或错误管理等。(我想让目的简单易读)。第二个问题实际上在上面的文本中提到了;)啊,是的,我读得不够仔细:)。不过,提供代码来重现编译时遇到的问题总是一个好主意()-这使找到适用于您的具体案例的解决方案变得更加容易。这看起来是个好主意,我成功地将其编译,非常感谢!我想我今天学到了一些新东西:)
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);
    }
}
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()
    }
}