以特定结构作为参数的特征实现
Trait implementation with specific struct as parameter
我有一个可读可写流的特性(比如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
方法中得到错误 "expected type parameter, found struct std::net::TcpStream
"。至于 free
方法,我知道 shutdown
是 TcpStream
-specific,但我想在那时有一个特定于 TcpStream
s 的实现,因此能够调用 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()
}
}
实际上不需要关闭的流,只需将实现留空即可。
我有一个可读可写流的特性(比如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
方法中得到错误 "expected type parameter, found struct std::net::TcpStream
"。至于 free
方法,我知道 shutdown
是 TcpStream
-specific,但我想在那时有一个特定于 TcpStream
s 的实现,因此能够调用 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()
}
}
实际上不需要关闭的流,只需将实现留空即可。