作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个函数,该函数接受字符串的可变引用并附加一些文本。
fn append_str(s: &mut String) {
s.push_str(" hi");
}
假设我有一个字符串。
let mut s: String = "hi".to_string();
如果我创建了对
s
的可变引用,并将其传递给
append_str
,那么它将毫无问题地进行编译。
let mut ss = &mut s;
append_str(&mut ss);
但是,如果我用
ss
明确定义
&mut String
,则它不会编译。
let ss: &mut String = &mut s;
append_str(&mut ss);
它显示以下编译器错误。
|
80 | let ss: &mut String = &mut s;
| -- help: consider changing this to be mutable: `mut ss`
81 | append_str(&mut ss);
| ^^^^^^^ cannot borrow as mutable
有趣的一件事是,如果我取消引用它,那么它会起作用。
let ss: &mut String = &mut s;
append_str(&mut *ss); // OK
在这种情况下我们必须显式取消引用的原因是什么?
mut
?
let ss = &mut s;
append_str(&mut ss); // ERROR
最佳答案
ss
已经是一个引用,因此&mut ss
为您(可变)引用提供了(可变)引用;如果您有ss
,则应直接使用它调用append_str
:append_str(ss)
。
只有当您错误地引用了对ss
的可变引用时,才需要将其声明为mut ss
。诸如此类的常规用法是将其传递给实际接受x: &mut &mut String
的函数,并使用诸如*x = &mut some_other_string
之类的函数使ss
引用对字符串的不同引用。在您的情况下,编译带有mut
的“固定”代码是因为编译器会自动为您取消引用双重引用。
关于rust - 何时取消引用可变引用的行为令人困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63612418/
我是一名优秀的程序员,十分优秀!