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



我有一个可读写流(如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);
}
}

我在acquire方法中得到错误"预期类型参数,找到结构体std::net::TcpStream"。至于free方法,我知道shutdown是特定于TcpStream的,但我希望在这一点上有一个针对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()
}
}

实际上不需要关闭的流只会让实现为空。

最新更新