【问题标题】:How to pad an array with zeros?如何用零填充数组?
【发布时间】:2021-11-25 09:42:57
【问题描述】:
fn main() {
    let arr: [u8;8] = [97, 112, 112, 108, 101];
    println!("Len is {}",arr.len());
    println!("Elements are {:?}",arr);
}
error[E0308]: mismatched types
 --> src/main.rs:2:23
  |
2 |     let arr: [u8;8] = [97, 112, 112, 108, 101];
  |              ------   ^^^^^^^^^^^^^^^^^^^^^^^^ expected an array with a fixed size of 8 elements, found one with 5 elements
  |              |
  |              expected due to this

有没有办法用 0 填充剩余的元素?比如:

let arr: [u8;8] = [97, 112, 112, 108, 101].something();

【问题讨论】:

    标签: rust rust-macros


    【解决方案1】:

    除了其他答案,你可以使用 const generics 来写一个专门的方法。

    fn pad_zeroes<const A: usize, const B: usize>(arr: [u8; A]) -> [u8; B] {
        assert!(B >= A);
        let mut b = [0; B];
        b[..A].copy_from_slice(&arr);
        b
    }
    

    Playground

    【讨论】:

    • 不错的简单解决方案。
    • 谢谢伙计。对于像我这样的初学者来说,简单的解决方案很容易理解。
    【解决方案2】:

    你可以使用concat_arrays 宏来实现它:

    use concat_arrays::concat_arrays;
    
    fn main() {
        let arr: [u8; 8] = concat_arrays!([97, 112, 112, 108, 101], [0; 3]);
        println!("{:?}", arr);
    }
    

    我认为没有外部依赖是不可能的。

    【讨论】:

      【解决方案3】:

      您可以从零开始,然后设置初始值。这要求 arrmut

      fn main() {
          let mut arr: [u8;8] = [0;8];
          let init = [97, 112, 112, 108, 101];
          arr[..init.len()].copy_from_slice(&init);
      
          println!("Len is {}",arr.len());
          println!("Elements are {:?}",arr);
      }
      

      链接到Playground

      【讨论】:

        猜你喜欢
        • 2018-11-30
        • 2016-06-15
        • 1970-01-01
        • 2017-10-24
        • 2016-11-06
        • 2018-10-05
        • 1970-01-01
        • 2021-08-07
        • 2020-06-06
        相关资源
        最近更新 更多