我正在阅读最初的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[..]
}
我理解为什么不可能从函数返回到字符串的链接,但为什么可以用这种方式返回到切片的链接?因为字符串本身是通过引用传递的,或者这不是原因吗?我是一个初学者,如果有人帮我了解这里发生了什么,我会很高兴的。
在第一种情况下,返回对本地范围的临时变量的引用。这不好,如前所述,该值将被删除,这将使任何引用无效。
在第二种情况下,您将返回对参数中提供的数据的引用,该引用的生存期在函数之外,所以这很好。返回值的生存期就是调用者参数的生存期,不管它是什么