types - 以特定结构作为参数的特征实现

标签 types rust traits

我有一个可读和可写流的特性(比如 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 方法,我知道 shutdownTcpStream 特定的,但我想有一个特定于 TcpStream 的实现s 在这一点上,因此能够调用 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()
    }
}

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

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

相关文章:

rust - 如何编写将 `self` 作为可变特征引用添加到集合的方法?

haskell - 为什么这个函数会导致编译时溢出?

c++ - 特性实例作为不同特征的模板参数

C++如何识别变量的类型

matrix - 如何将任意大小的矩阵传递给 Rust 中的函数?

java - 如果类泛型类型已经有界,通配符边界?

c# - 通用扩展方法可以返回 IEnumerable 类型吗?

rust - 如何创建一个 Box<UnsafeCell<[T]>>

rust - 为什么 std::str::parse 的签名不使用特征绑定(bind)?

rust - 为什么我不能在特定的生命周期内实现 Deref?