不能借用不可变的“值”,因为它也借用为可变的

2024-01-10

我发现很多关于不可变到可变的问题,但不太确定我在这段代码中做错了什么。

我收到的错误是: “借不到values之所以是不可变的,是因为它也被借用为可变的”

fn modify_vec_get_slice(values: &mut Vec<i32>) -> &[i32] {
    // Modify "values" in some way
    values.push(5);

    // Return a slice into "values" (dummy code)
    values.split_at(values.len() / 2).1
}

fn use_slice(slice: &[i32]) {
    // Do something immutably with the slice
}

fn use_vec(values: &Vec<i32>) {
    // Do something immutably with the vec
}

fn main() {
    let mut values = vec![1, 2, 3, 4];

    let slice = modify_vec_get_slice(&mut values); // use values mutably

    use_vec(&values); // Error here is "&values" underlined in red, even though "values" is used immutably

    use_slice(slice); // use slice immutably (which refers to the vec?). Uncommenting this line fixes the error
}

当我可以使用 &values (也是一个不可变引用)时,为什么我不能使用切片(一个不可变引用)?当我到达其他函数时,“modify_vec_get_slice”中使用的可变引用肯定已经结束了吗?


问题是slice实际上拥有可变借款values。对您来说,情况似乎不应该是这样,因为返回的引用modify_vec_get_slice()是不可变的,但是该不可变引用与赋予该函数的可变引用的生命周期相关联。如果我们通过以下方式显式指定编译器假定的生命周期终生省略 https://doc.rust-lang.org/nomicon/lifetime-elision.html,这就变得清楚了:

fn modify_vec_get_slice<'a>(values: &'a mut Vec<i32>) -> &'a [i32] {

返回的引用只允许与可变借用一样长地存在,因此延长了引用的生命周期slice也扩展了可变借用。在这种情况下,不会发生任何类型的隐含“引用类型降级”。

解决此问题的最简单方法是将函数分为两部分,一种采用可变引用并执行突变,另一种采用不可变引用并计算切片的边界并返回它。

进一步阅读:

  • 返回不可变引用,对 self 进行可变引用 https://users.rust-lang.org/t/return-immutable-reference-taking-mutable-reference-to-self/16970
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

不能借用不可变的“值”,因为它也借用为可变的 的相关文章

随机推荐