如何使用BufReader的fill_buff并通过TcpStream进行消费

问题描述 投票:0回答:1

以下代码无法编译

use std::io::{BufRead, BufReader};
use std::net::{TcpListener};

fn main() {
    let listener = TcpListener::bind(format!("0.0.0.0:{}", 7007)).unwrap();
    for stream in listener.incoming() {
        let mut stream = stream.unwrap();
        let mut buf_reader = BufReader::new(&mut stream);
        let buf = buf_reader.fill_buf().unwrap();
        buf_reader.consume(buf.len())
    }
}

有错误:

error[E0499]: cannot borrow `buf_reader` as mutable more than once at a time
  --> src/main.rs:10:9
   |
9  |         let buf = buf_reader.fill_buf().unwrap();
   |                   --------------------- first mutable borrow occurs here
10 |         buf_reader.consume(buf.len())
   |         ^^^^^^^^^^^^^^^^^^^---------^
   |         |                  |
   |         |                  first borrow later used here
   |         second mutable borrow occurs here

我不明白这与文档示例中使用的代码有什么不同

rust compiler-errors compilation lifetime borrow-checker
1个回答
0
投票

fill_buf
方法采用对结构的可变引用,因此这是一种可变借用。
consume
方法also需要一个
&mut self
,与
fill_buf
相同,所以这是不行的。

在 Rust 中,可变引用是完全排他的,你不能持有对同一内存块的多个可变引用。

您的代码与文档中的示例之间的区别在于,一旦您获取了长度,编译器就知道您已经完成了

buf
(读者的第一个可变借用),因此它可以释放“锁”,这样当您打电话时要说话并做好准备
.consume

尽管逻辑上两者应该是等效的,请记住Rust编译器正在执行所有这些(非常复杂的)静态分析来为您管理内存资源,并且它在某种程度上受到源代码的text的限制,而不是这是逻辑运行时语义。

© www.soinside.com 2019 - 2024. All rights reserved.