Rust中相对向量调整的单行程序

时间:2017-08-02 16:08:05

标签: rust idiomatic

如果我想用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);

但我很确定有一个单行......

1 个答案:

答案 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);
}

请注意您需要执行的旋转才能在两个方向上调整大小。即使这样,如果你调整到零以下,仍有恐慌的可能性。