gpt4 book ai didi

rust - 何时取消引用可变引用的行为令人困惑

转载 作者:行者123 更新时间:2023-12-03 11:41:42 25 4
gpt4 key购买 nike

我有一个函数,该函数接受字符串的可变引用并附加一些文本。

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com