为什么这被认为是借来的

Why is this considered borrowed

提问人:Tiago Dias 提问时间:7/1/2023 最后编辑:cafce25Tiago Dias 更新时间:7/1/2023 访问量:65

问:

我一直在学习 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;
}   
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;
}   

是否有可能有人解释为什么只有第二个有效?

rust borrow-checker borrow

评论

1赞 isaactfa 7/1/2023
这可能会令人困惑,因为生命周期省略。 实际上,只要在你的第一个例子中还活着,就借来了,但你的第二个例子不是。first_word(s: &String) -> &i32first_word<'a>(s: &'a String) -> &'a i32xy

答:

6赞 Sebastian Redl 7/1/2023 #1

Rust 不会研究函数来了解它们在外部是如何工作的。函数签名必须包含所有必要的信息。

签名说“接受对字符串的引用”(顺便说一句,使用 ,always instead 实际上从来没有用过),并返回对 int 的引用。但 Rust 也需要生存期信息,即引用背后的事物存在多长时间的一些限制。fn first_word(s: &String) -> &i32&String&str

其工作方式是一个非常简单的过程,称为生命周期省略。对于“获取引用,返回引用”,理智的假设是返回的任何内容都与传入的内容有某种关系,因此完整的签名变为 .fn first_word<'a>(s: &'a String) -> &'a i32

这意味着,当编译器看到对 的调用时,它会假设只要你保留返回的引用(在你的代码中),传入的东西仍然是借用的。first_wordy