Tcp 如果BufReader拥有一个流的所有权,我如何在它上面读写行?
我想从Tcp 如果BufReader拥有一个流的所有权,我如何在它上面读写行?,tcp,rust,tcp-ip,Tcp,Rust,Tcp Ip,我想从TCPStream读一行,再写一行,然后重复。问题在于BufReader::new拥有myTCPStream变量的所有权: let stream = ...; // TCPStream let reader = BufReader::new(stream); // moved its value // can't use stream here anymore 解决这个问题的简单方法是什么?您有几种可能: 不要使用BufReader 使用从BufReader临时借用流 完全丢弃Bu
TCPStream
读一行,再写一行,然后重复。问题在于BufReader::new
拥有myTCPStream
变量的所有权:
let stream = ...; // TCPStream
let reader = BufReader::new(stream); // moved its value
// can't use stream here anymore
解决这个问题的简单方法是什么?您有几种可能:
- 不要使用
BufReader
- 使用从
临时借用流BufReader
- 完全丢弃
,并使用BufReader
BufReader
,除非您确实需要缓冲输入;就一行而言,这似乎不值得
否则,如果完成了缓冲,则可以恢复底层流,如果没有,则可以临时缓冲它
注意:请注意,BufReader
缓冲读取,因此当您借用/恢复内部流时,您会使缓冲数据短路;阅读是一个问题,在你的情况下(写作)应该没问题。解决方案:使用参考资料。
解释 如果我们仔细看一下
BufReader::new
,我们会发现它采用了R
类型的inner
,其中R
只是实现读取的任何类型:
impl<R: Read> BufReader<R> {
pub fn new(inner: R) -> BufReader<R> { ... }
}
因此,我们只需传递一个对new
函数的引用,如下所示:
let reader = BufReader::new(&stream);
我们将对BufWriter
和Write
执行相同的操作,并将看到确实存在以下实现:
impl<'a> Read for &'a TcpStream
impl<'a> Write for &'a TcpStream
implicate of or。对于未实现读写引用的板条箱,例如,您可以使用
impl<'a> Write for &'a TcpStream