在脚本语言中,要把Vec<>中两两值进行对调,这个是太过于轻松的事情不过了。但是对于Rust而言,还是有些麻烦。
一、如何对Vec<&str>两两值进行对调?
fn swap(vec: Vec<&str>, i: usize, j: usize) -> Vec<&str> {
let mut v = vec.clone();
let len = v.len();
if len < i + 1 || len < j + 1 {
panic!("swap: i:{},j:{} is not fit!", i, j);
}
if let Some(v_i) = v.get_mut(i) {
*v_i = &vec[j];
}
if let Some(v_j) = v.get_mut(j) {
*v_j = &vec[i];
}
println!("before swap vec:{:?}", vec);
println!("after swap vec:{:?}", v);
v
}
fn main() {
println!("swap : {:?}", swap(vec!["ab", "bc", "de"], 1, 2));
}
输出结果:
before swap vec:["ab", "bc", "de"]
after swap vec:["ab", "de", "bc"]
有其它写法,比如简化一些?:
fn swap(vec: Vec<&str>, i: usize, j: usize) -> Vec<&str> {
let mut v = vec.clone();
let len = v.len();
if len < i + 1 || len < j + 1 {
panic!("swap: i:{},j:{} is not fit!", i, j);
}
// (v.get_mut(i), v.get_mut(j))=>部分报错
if let (Some(v_i), Some(v_j)) = (v.get_mut(i), v.get_mut(j)) {
*v_i = &(vec.clone())[j];
*v_j = &(vec.clone())[i];
}
println!("before swap vec:{:?}", vec);
println!("after swap vec:{:?}", v);
v
}
以下的写法可以运行,但结果是不对的,可以看看具体什么原因造成的。clone()?
fn swap(vec: Vec<&str>, i: usize, j: usize) -> Vec<&str> {
let mut v = vec.clone();
let len = v.len();
if len < i + 1 || len < j + 1 {
panic!("swap: i:{},j:{} is not fit!", i, j);
}
if let (Some(v_i), Some(v_j)) = (v.clone().get_mut(i), v.clone().get_mut(j)) {
*v_i = &vec[j]; //i_val;
*v_j = &vec[i];
}
// if let Some(v_i) = v.get_mut(i) {
// *v_i = &vec[j]; //i_val;
// }
// if let Some(v_j) = v.get_mut(j) {
// *v_j = &vec[i];
// }
println!("before swap vec:{:?}", vec);
println!("after swap vec:{:?}", v);
v
}
二、标准库中的用法
在Rust中有swap函数,可以直接使用:
let mut v = ["a", "b", "c", "d"];
v.swap(1, 3);
assert!(v == ["a", "d", "c", "b"]);