如果我想用C ++ / Swift /任何其他语言调整矢量大小,我通常会写这样的my_vec.resize(my_vec.size(), 0x00);
,但如果我在Rust中尝试这个,我会收到错误immutable borrow occurs here
。
当然我可以这样写:
let old_size = my_vec.len();
my_vec.resize(old_size - 2, 0x00);
但我很确定有一个单行......
答案 0 :(得分:3)
如Cannot borrow as immutable because it is also borrowed as mutable in function arguments中所述,您目前无法将这两行放入一行。
但我很确定有一个单行......
当然:
{ let old_size = my_vec.len(); my_vec.resize(old_size - 2, 0x00); }
不那么厚颜无耻,你可以添加一个特质方法:
trait ResizeRelative<T> {
fn resize_relative(&mut self, delta: isize, default: T);
}
impl<T: Clone> ResizeRelative<T> for Vec<T> {
fn resize_relative(&mut self, delta: isize, default: T) {
let len = if delta < 0 {
self.len() - ((-delta) as usize)
} else {
self.len() + delta as usize
};
self.resize(len, default);
}
}
fn main() {
let mut v = Vec::new();
v.resize_relative(3, 42);
v.resize_relative(-1, 2);
println!("{:?}", v);
}
请注意您需要执行的旋转才能在两个方向上调整大小。即使这样,如果你调整到零以下,仍有恐慌的可能性。