当我试图理解一个可变变量(是一个引用),例如 let mut x: &i32
和可变引用,例如 let x: &mut i32
之间的区别时,我发现了这个我无法理解的差异:
以下代码可以正常工作,其中 by_ref
具有如下签名:fn by_ref(&mut self) -> &mut Self
(文档)
fn example(mut t: &TcpStream) {
t.by_ref();
}
但是使用类似签名的方法 reserve
,对于以下的String
类型的情况,则不同:
pub fn reserve(&mut self, additional: usize)`
但是这种方法行不通,错误提示是:
“无法将 *str 作为可变引用来借用,因为它在 & 引用之后”
fn example(mut str: &String) {
str.reserve(10);
}
有趣的是,这两个使用可变引用的示例可以正常工作,并且据我所知,这也是推荐的使用可变方法的方式:
fn example_stream(t: &mut TcpStream) {
t.by_ref();
}
fn example_string(str: &mut String) {
str.reserve(10);
}
那么一个
TcpStream
和一个 String
之间有什么不同,使得一个可以调用具有 &mut self
参数的方法,而另一个不行?