微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从迭代器初始化数组数组

如何解决从迭代器初始化数组数组

我正在尝试使用 const 泛型从迭代器初始化数组数组。 以下代码作为示例:

pub fn foo<const R: usize,const C: usize>(iter: Iter<i32>) -> [[i32; C]; R] {
    let mut res: [[MaybeUninit<i32>; C]; R] = unsafe { MaybeUninit::uninit().assume_init() };
    let mut counter = 0;
    res.iter_mut().flatten().zip(iter).for_each(|(r,l)| {
        *r = MaybeUninit::new(*l);
        counter += 1;
    });
    assert_eq!(counter,R * C);
    unsafe { transmute::<_,[[i32; C]; R]>(res) }
}

但是,我收到错误

error[E0512]: cannot transmute between types of different sizes,or dependently-sized types
  --> src\main.rs:14:14
   |
14 |     unsafe { transmute::<_,[[i32; C]; R]>(res) }
   |              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
   |
   = note: source type: `[[MaybeUninit<i32>; C]; R]` (this type does not have a fixed size)
   = note: target type: `[[i32; C]; R]` (this type does not have a fixed size)

这两种类型显然都有固定的大小,所以我不明白这个错误......

如果我在程序中使用带有特定值的代码,它会起作用:

    let iter = (0..4);

    let res = {
        let mut res: [[MaybeUninit<i32>; 2]; 2] = unsafe { MaybeUninit::uninit().assume_init() };
        res.iter_mut().flatten().zip(iter).for_each(|(r,l)| {
            *r = MaybeUninit::new(l);
        });
        unsafe { transmute::<_,[[i32; 2]; 2]>(res) }
    };

    println!("{:?}",res);   //[[0,1],[2,3]]

这是 const 泛型的一些错误还是我做错了什么??

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。