我正在进行沙沙声练习,但我遇到了一些我不完全理解生命的问题。我会将代码简化为仅令人困惑的部分。
该函数编译正确:
fn string_uppercase(mut data: &String) {
let newdata: &String = &data.to_uppercase();
}
这个功能没有
fn string_uppercase(mut data: &String) {
data = &data.to_uppercase();
}
并显示以下错误:
error[E0716]: temporary value dropped while borrowed
--> exercises/06_move_semantics/move_semantics6.rs:25:13
|
24 | fn string_uppercase(mut data: &String) {
| - let's call the lifetime of this reference `'1`
25 | data = &data.to_uppercase();
| --------^^^^^^^^^^^^^^^^^^^- temporary value is freed at the end of this statement
| | |
| | creates a temporary value which is freed while still in use
| assignment requires that borrow lasts for `'1`
error: aborting due to 1 previous error; 1 warning emitted
我已经做了一些chatGPTing和SOflowing(例如this)并且我了解以下内容:
data.to_uppercase()
函数调用将创建一个新的字符串这很清楚,但是尝试将其保存在
data
与 newdata
中有何区别。在这两种情况下,我都试图保存这个临时值以避免它被删除,但是一种有效,另一种则无效。
第二个示例具有显式生命周期:
fn string_uppercase<'a>(mut data: &'a String) {
// data has type &'a String
data = &data.to_uppercase();
}
data.to_uppercase()
创建一个临时变量,该变量在封闭语句的末尾被删除。这意味着 &data.to_uppercase()
不能具有类型 &'a String
,它的寿命不够长。关键事实是,当重新分配 data
时,data
的类型会被保留。
在第一个示例中,
newdata
是一个新变量,因此可以根据需要具有尽可能短的生命周期。因此,它可以编译。