为什么我不能从函数返回指向字符串的链接,但我可以切片吗?



我正在阅读最初的Rust指南。这表明,从函数中返回对字符串的引用是不可能的。

fn dangle() -> &String { // dangle returns a reference to a String
let s = String::from("hello"); // s is a new String
&s // we return a reference to the String, s
} // Here, s goes out of scope, and is dropped. Its memory goes away.
// Danger!

但我被下一章的例子弄糊涂了,在这个例子中,切片的链接是从函数返回的

fn first_word(s: &String) -> &str {
let bytes = s.as_bytes();
for (i, &item) in bytes.iter().enumerate() {
if item == b' ' {
return &s[0..i];
}
}
&s[..]
}

我理解为什么不可能从函数返回到字符串的链接,但为什么可以用这种方式返回到切片的链接?因为字符串本身是通过引用传递的,或者这不是原因吗?我是一个初学者,如果有人帮我了解这里发生了什么,我会很高兴的。

在第一种情况下,返回对本地范围的临时变量的引用。这不好,如前所述,该值将被删除,这将使任何引用无效。

在第二种情况下,您将返回对参数中提供的数据的引用,该引用的生存期在函数之外,所以这很好。返回值的生存期就是调用者参数的生存期,不管它是什么

相关内容

最新更新