提问人:Tiago Dias 提问时间:7/1/2023 最后编辑:cafce25Tiago Dias 更新时间:7/1/2023 访问量:65
为什么这被认为是借来的
Why is this considered borrowed
问:
我一直在学习 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;
}
是否有可能有人解释为什么只有第二个有效?
答:
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_word
y
评论
first_word(s: &String) -> &i32
first_word<'a>(s: &'a String) -> &'a i32
x
y