我刚接触Rust,对于借用检查器有些困难。
从main
中调用consume_byte
函数是完全没有问题的。但是如果我尝试添加另一个函数(consume_two_bytes
),一切都会崩溃。
由于在consume_two_bytes
函数中的reader
变量不可变且无法被借用,所以以下代码无法编译。
在函数签名中添加&mut
只会改变编译器错误。
use std::io::Read;
use std::net::TcpListener;
fn consume_byte<R>(reader: R) where R: Read {
let mut buffer = vec![];
reader.take(1).read_to_end(&mut buffer).unwrap();
}
fn consume_two_bytes<R>(reader: R) where R: Read {
consume_byte(&mut reader);
consume_byte(&mut reader);
}
fn main() {
let listener = TcpListener::bind("127.0.0.1:8080").unwrap();
let (mut stream, _) = listener.accept().unwrap();
consume_byte(&mut stream);
consume_byte(&mut stream);
consume_two_bytes(&mut stream);
}
&
的情况下使用mut
。这是我自己的一些严重的隧道视觉问题。 - Donald Hmut
出现在不同的位置有点不直观。 - fjhimpl<'a, R: Read + ?Sized> Read for &'a mut R
(即对实现了Read
的类型的可变引用也实现了Read
)。但这并不一定适用于其他特征。 - Francis Gagné