如何同时从一个向量中获得2个不同的可变元素?

时间:2018-08-09 17:02:26

标签: vector rust mutable

是否有一种快速的方法来同时可变地访问Vec的2个不同元素:(playground)

fn foo(a: &mut String, b: &mut String) {
    a.push(' ');
    b.push('!');
    println!("{0}{1}", a, b);
}

fn main() {
    let a_index = 0;
    let b_index = 1;

    let mut vec = vec!["Hello".to_owned(), "World".to_owned()];

    let a = &mut vec[a_index]; // first borrow
    let b = &mut vec[b_index]; // second borrow
    foo(a, b);
}

虽然我完全理解为什么这行不通,但令我惊讶的是,没有像take_two<T>(a: usize, b: usize) -> (T, T)这样的方法,因为这应该是一个非常常见的问题。


在寻找答案时,我找到了此解决方案:

fn get_two_mut<T>(slice: &mut [T], a: usize, b: usize) -> (&mut T, &mut T) {
    assert!(a != b);
    let mut iter = slice.iter_mut();
    if a <= b {
        (iter.nth(a).unwrap(), iter.nth(b - a - 1).unwrap())
    } else {
        (iter.nth(b).unwrap(), iter.nth(a - b - 1).unwrap())
    }
}

但这与不必要的情况相比显得不必要且复杂,因此我宁愿使用其他方法。

0 个答案:

没有答案