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
拥有my
TCPStream
变量的所有权:

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