是否有一种快速的方法来同时可变地访问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())
}
}
但这与不必要的情况相比显得不必要且复杂,因此我宁愿使用其他方法。