我想从 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);
我们将对 BufWriter
和 Write
做同样的事情,并且会看到确实有这个实现:
impl<'a> Write for &'a TcpStream
因此,我们可以再次使用不可变引用来创建 BufWriter
。
关于rust - 如果 BufReader 取得流的所有权,我如何在其上读取和写入行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35869078/