tokio::net::TcpStream 如何实现 tokio::prelude::Stream?

4
tokio.rs 的文档中,我们看到以下代码片段。
// split the socket stream into readable and writable parts
let (reader, writer) = socket.split();
// copy bytes from the reader into the writer
let amount = io::copy(reader, writer);

我假设split确实是Stream::split,但是我无法理解这个特质如何适用于TcpStream,因为流页面没有提到TcpStream,反之亦然。


你说的“how”是什么意思?几乎所有的特征都以相同的方式为类型实现:impl Trait for Type { ... }。有时这段代码是由宏或其他东西生成的,但最终效果是一样的。 - Shepmaster
文档显示了一个类型实现了哪些特征以及它们提供了哪些方法。链接 - Shepmaster
你可以测试一个类型是否实现了一个 trait:如何在编译时强制要求一个类型实现一个 trait? - Shepmaster
也许我的编辑可以帮助你理解我在问什么。我知道如何定义特质。我的问题是,鉴于两者之间没有明显的联系,我该如何建立这种联系?它是一些模板实现的链吗?我不知道。 - benjumanji
当我链接到TcpStream文档时,你是否在页面上搜索了split方法?链接为https://docs.rs/tokio/0.1.20/tokio/net/struct.TcpStream.html#impl-AsyncRead - Shepmaster
好吧,我感到很尴尬。我发誓我花了很长时间阅读那个+ctrl-f split。真丢脸! - benjumanji
1个回答

3

tokio::net::TcpStream 实现了 AsyncRead 接口。

AsyncRead 提供的方法之一是 split() 方法。

fn split(self) -> (ReadHalf<Self>, WriteHalf<Self>)
where
    Self: AsyncWrite, 

在这种情况下,与您的问题所建议的不同,它并不是使用Stream::split,因为根据您的观察,tokio::net::TcpStream不是Stream的实现者。

最好明确地列出你所采取的确切步骤,这样 OP 就可以将这种逻辑应用于其他任务。 - Shepmaster

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接