如果BufReader取得流的所有权,我该如何读取和写入行?

时间:2016-03-08 13:44:52

标签: tcp rust tcp-ip

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

let stream = ...; // TCPStream

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

// can't use stream here anymore

对此有什么简单的解决方案?

2 个答案:

答案 0 :(得分:20)

解决方案:使用参考。

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

解释

如果我们仔细查看BufReader::new,我们会发现它需要inner类型的R,其中R只是实现Read的任何类型1}}:

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);

我们将对BufReaderWrite执行相同操作,并且会看到确实存在此实现:

impl<'a> Write for &'a TcpStream

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

答案 1 :(得分:3)

您有几种可能性:

  • 请勿使用BufReader
  • 使用get_mut
  • 暂时从BufReader借用流
  • 完全丢弃BufReader并使用into_inner
  • 恢复流

我个人建议不要使用BufReader,除非你真的需要缓冲输入;对于单行,它似乎不值得。

否则,如果您已完成缓冲,则可以恢复基础流,如果不是,则可以暂时缓冲它。

警告请注意BufReader缓冲区读取,因此当您借用/恢复内部流时,您会将缓冲数据短路;阅读它是一个问题,在你的情况下(写作)应该没问题。