为什么这被认为是借用的

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)

有人可以解释为什么只有第二个有效吗?

Seb*_*edl 6

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 ),传入的内容仍然是借用的。