以下代码无法编译
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
我不明白这与文档示例中使用的代码有什么不同
fill_buf
方法采用对结构的可变引用,因此这是一种可变借用。 consume
方法also需要一个&mut self
,与fill_buf
相同,所以这是不行的。
在 Rust 中,可变引用是完全排他的,你不能持有对同一内存块的多个可变引用。
您的代码与文档中的示例之间的区别在于,一旦您获取了长度,编译器就知道您已经完成了
buf
(读者的第一个可变借用),因此它可以释放“锁”,这样当您打电话时要说话并做好准备 .consume
。
尽管逻辑上两者应该是等效的,请记住Rust编译器正在执行所有这些(非常复杂的)静态分析来为您管理内存资源,并且它在某种程度上受到源代码的text的限制,而不是这是逻辑运行时语义。