我希望能够从TCPStream
中读取一行,再写入另一行,然后重复执行。问题在于BufReader::new
占用了我的TCPStream
变量:
let stream = ...; // TCPStream
let reader = BufReader::new(stream); // moved its value
// can't use stream here anymore
这个问题有什么简单的解决方案吗?
我希望能够从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
。
BufReader
get_mut
暂时借用BufReader
的流BufReader
并使用into_inner
恢复流BufReader
; 对于单行输入,这似乎不值得。BufReader
会缓冲读取,因此当您借用/恢复内部流时,会短路缓冲数据;对于读取来说这是个问题,在您的情况下(写入)应该没问题。