Tia*_*ias 1 rust borrow-checker borrow
我一直在学习 Rust,并且一直在尝试学习借用检查器的工作原理,但我遇到了这两个例子,我不明白为什么只有其中一个被认为是借用的:
fn main() {
let mut x = String::from("aa ab");
let y = first_word(&x);
x.clear(); //Error cannot borrow X
println!("{y}");
}
//Returns an i32 reference
fn first_word(s: &String) -> &i32 {
return &32;
}
Run Code Online (Sandbox Code Playgroud)
fn main() {
let mut x = String::from("aa ab");
let y = first_word(&x);
x.clear(); //Everything is fine
println!("{y}");
}
//Returns an i32
fn first_word(s: &String) -> i32 {
return 32;
}
Run Code Online (Sandbox Code Playgroud)
有人可以解释为什么只有第二个有效吗?
Rust 不会通过研究函数来了解它们在外部是如何工作的。函数签名必须包含所有必要的信息。
签名fn first_word(s: &String) -> &i32表示“获取对字符串的引用”(顺便说一下,实际上使用 a 从来没有用&String,总是使用它&str),并返回对 int 的引用。但 Rust 还需要生命周期信息,即引用背后的事物的生命周期的一些限制。
它的工作方式是一个非常简单的过程,称为生命周期省略。对于“获取引用,返回引用”,合理的假设是返回的内容在某种程度上与传入的内容相关,因此完整的签名变为fn first_word<'a>(s: &'a String) -> &'a i32.
这意味着编译器在看到对 的调用时first_word,会假设只要您保留返回的引用(y代码中的 the ),传入的内容仍然是借用的。