【问题标题】:One-liner for relative-vector-resizing in RustRust 中相对向量调整大小的单行代码
【发布时间】:2018-01-09 23:26:10
【问题描述】:

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

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

【问题讨论】:

标签: rust idioms


【解决方案1】:

您目前不能按照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 方法:

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

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

【讨论】:

  • 啊,现在我明白了这个问题......我以为函数是在函数参数之后评估的;没想到功能真的扩展到Vec::resize(&amp;mut my_vec, ...)
猜你喜欢
  • 1970-01-01
  • 2021-04-09
  • 1970-01-01
  • 1970-01-01
  • 2018-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多