rust - 如果 BufReader 取得流的所有权,我如何在其上读取和写入行?

标签 rust tcp

我想从 TCPStream 中读取一行,向其中写入另一行,然后重复。问题是 BufReader::new 取得了我的 TCPStream 变量的所有权:

let stream = ...; // TCPStream

let reader = BufReader::new(stream); // moved its value

// can't use stream here anymore

有什么简单的解决方案?

最佳答案

解决方案:使用引用。

let mut stream = ...;
let reader = BufReader::new(&stream);
let writer = BufWriter::new(&stream);

说明

如果我们仔细查看 BufReader::new,我们会发现它接受类型为 R 的参数 inner,其中 R 只是实现 Read 的任何类型:

impl<R: Read> BufReader<R> {
    pub fn new(inner: R) -> BufReader<R> { ... }
}

然后我们看一下 Read 并看到这个实现:

impl<'a> Read for &'a TcpStream

所以我们可以传递一个对new函数的引用,像这样:

let reader = BufReader::new(&stream);

我们将对 BufWriterWrite 做同样的事情,并且会看到确实有这个实现:

impl<'a> Write for &'a TcpStream

因此,我们可以再次使用不可变引用来创建 BufWriter

关于rust - 如果 BufReader 取得流的所有权,我如何在其上读取和写入行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35869078/

相关文章:

ssl - erlang 安全 tcp 中的 {active, N} 模式

python - 同时使用相同端口、相同 IP 地址的应用程序/协议(protocol)

c# - UDP数据传输比TCP慢

qt - 使用Qt通过TCP接收原始图像数据进行显示

c# - 异步 TCP 读取期间的 Stackoverflow

closures - 将闭包传递给递归函数

windows - 创建窗口时 ntdll.dll 中的 SIGSEGV

function - 局部函数访问外部变量

rust - 什么是已弃用的 std::raw::Repr 的现代模拟?

rust - 编译器(特别是 rustc)真的可以简化三角求和以避免循环吗?如何?