我想从TCPStream
读取一行,给它写另一行,然后重复。问题是BufReader::new
取得了TCPStream
变量的所有权:
let stream = ...; // TCPStream
let reader = BufReader::new(stream); // moved its value
// can't use stream here anymore
对此有什么简单的解决方案?
答案 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);
我们将对BufReader
和Write
执行相同操作,并且会看到确实存在此实现:
impl<'a> Write for &'a TcpStream
因此,我们可以再次使用不可变引用来创建BufWriter
。
答案 1 :(得分:3)
您有几种可能性:
BufReader
get_mut
BufReader
借用流
BufReader
并使用into_inner
我个人建议不要使用BufReader
,除非你真的需要缓冲输入;对于单行,它似乎不值得。
否则,如果您已完成缓冲,则可以恢复基础流,如果不是,则可以暂时缓冲它。
警告:请注意BufReader
缓冲区读取,因此当您借用/恢复内部流时,您会将缓冲数据短路;阅读它是一个问题,在你的情况下(写作)应该没问题。