如何修改数组的最后一个元素?

5

由于arr被借用为可变的,因此无法通过调用len()来获取arr的长度。我陷入了困境,有什么正确的方法吗?

fn double_last(arr: &mut[i32]) -> &i32 {
    let last = &mut arr[arr.len() - 1];  // borrow checker error.
    //let last = &mut arr[3];            // fine
    *last *= 2;
    last
}

fn main() {
    let mut a = [1,2,3,4];
    println!("{}", double_last(&mut a));
    println!("{:?}", a);
}

借用检查器自问题提出以来已经进行了许多改进,现在可以从 2015 版本开始编译该示例而不会出现错误。 Playground - Kaplan
2个回答

8
如果你只需要最后一个元素,可以使用 std::slice::last_mut
fn double_last(arr: &mut[i32]) -> &i32 {
    let last = arr.last_mut().unwrap();
    *last *= 2;
    last
}

是的,干净多了。这让我想起来,如果数组为空,返回类型应该是一个选项(Option),谢谢提醒。 - limon
@limon,是的,如果您不能保证数组不为空,或者此函数为公共函数,因此无法控制它们的使用方式,则“Option”是更好的选择。 - WiSaGaN

2
希望在不久的将来引入非词法生命周期和相应的更改,这可能会解决这个问题。目前,您可以通过拆分该计算来满足借用检查器的要求。
let n = arr.len() - 1;
let last = &mut arr[n];

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接