变量重新分配导致生命周期问题

问题描述 投票:0回答:1

我正在进行沙沙声练习,但我遇到了一些我不完全理解生命的问题。我会将代码简化为仅令人困惑的部分。

该函数编译正确:

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)并且我了解以下内容:

  1. data.to_uppercase()
    函数调用将创建一个新的字符串
  2. 该值是在表达式中创建的,因此称为临时值,因为如果未保存在变量中,它将被删除。

这很清楚,但是尝试将其保存在

data
newdata
中有何区别。在这两种情况下,我都试图保存这个临时值以避免它被删除,但是一种有效,另一种则无效。

rust lifetime rust-rustlings
1个回答
0
投票

第二个示例具有显式生命周期:

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
是一个新变量,因此可以根据需要具有尽可能短的生命周期。因此,它可以编译。

© www.soinside.com 2019 - 2024. All rights reserved.