如何在不复制向量的情况下将Vec <T>转换为Vec <U>?

Tversteeg

我想将a转换Vec<T>Vec<U>whereT是某种原始类型,并且UT:的新类型struct U(T)

我尝试过这样的事情:

struct Foo(u32);

fn do_something_using_foo(buffer: &mut Vec<Foo>) {}

fn main() {
    let buffer: Vec<u32> = vec![0; 100];

    do_something_using_foo(&mut buffer as Vec<Foo>);
}

我不想复制向量,我想将u32字段包装在newtype中Foo

这给出了错误:

error[E0308]: mismatched types
 --> main.rs:8:28
  |
8 |     do_something_using_foo(&mut buffer as Vec<Foo>);
  |                            ^^^^^^^^^^^^^^^^^^^^^^^ expected mutable reference, found struct `std::vec::Vec`
  |
  = note: expected type `&mut std::vec::Vec<Foo>`
         found type `std::vec::Vec<Foo>`
  = help: try with `&mut &mut buffer as Vec<Foo>`

error: non-scalar cast: `&mut std::vec::Vec<u32>` as `std::vec::Vec<Foo>`
 --> main.rs:8:28
  |
8 |     do_something_using_foo(&mut buffer as Vec<Foo>);
  |                            ^^^^^^^^^^^^^^^^^^^^^^^

error: aborting due to previous error(s)
Shepmaster

无法在安全的Rust中更改值的类型。不能保证这两种类型将具有相同的大小或相同的语义。

这适用于单个值(T-> U)以及合计值(Vec<T>-> Vec<U>HashMap<K1, V1>-> HashMap<K2, V2>)。注意,聚合值实际上只是“单个”值的一种特殊情况。


最好的办法是创建一个新向量:

let buffer2 = buffer.into_iter().map(Foo).collect();

你也可以调整do_something_using_foo采取一个共同的泛型类型,无论Foou32实施:

use std::borrow::{Borrow, BorrowMut};

#[derive(Debug, Clone)]
struct Foo(u32);

impl Borrow<u32> for Foo {
    fn borrow(&self) -> &u32 {
        &self.0
    }
}

impl BorrowMut<u32> for Foo {
    fn borrow_mut(&mut self) -> &mut u32 {
        &mut self.0
    }
}

fn do_something_using_foo<T>(buffer: &mut [T])
where
    T: BorrowMut<u32>,
{
}

fn main() {
    let mut buffer_u32 = vec![0u32; 100];
    let mut buffer_foo = vec![Foo(0); 100];

    do_something_using_foo(&mut buffer_u32);
    do_something_using_foo(&mut buffer_foo);
}

在不安全的Rust中,从技术上讲,这是可能的-您可以随意射击自己的脚。

std::mem::transmute如果您知道自己在做什么,可以使用类似的方法

然而,这是不确定的行为,以使用transmuteVec作为的表现Vec没有定义。相反,请参阅Sven Marnach的答案

也可以看看:

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

当U的From <T>可用时,将Vec <T>转换为Vec <U>

如何在不复制元素的情况下将Vec转换为数组?

是否可以在不复制数据的情况下将 Vec<&[u8]> 展平为 &[u8] ?

如何将Vec <&mut T>转换为Vec <&T>?

如何将Vec <Rgb <u8 >>转换为Vec <u8>

将Vec <u64>转换为Vec <(&str,u64)>以获得tui :: BarChart数据

将Vec <u32>转换为Vec <u8>并以最小的开销

将Vec <Vec <u8 >>转换为&[&[u8]]

将&[T]类型的输入向量转换为Vec <T>

如何将 Vec<T> 转换为 HashMap<T,T>?

将 Vec<u32> 转换为 Vec<u64>(或 Vec<std::os::raw::c_ulong>)

如何在Windows上将OsStr转换为&[u8] / Vec <u8>?

使用flat_map将Vec <u8>转换为Vec <char>

将u8数组的引用转换为<Vec <u8 >>

如何将IoSliceMut数组转换为Vec <u8>?

如何将 Vec<u8> 转换为 bson::document::Document?

如何在不复制对象的情况下将字符串转换为char []?

如何在不复制的情况下将ndarray :: ArrayView转换为&ndarray :: Array?

是否有将Vec <T>转换为数组的好方法?

如何使用Rust和Web-sys将Clamped <Vec <u8 >>转换为Clamped <&mut [u8]>?

如何将Vec <T>转换为C友好的* mut T?

对于所有类型“ T”,“ U”,如果将“ T”强制转换为“ U”,那么将“&T”强制转换为“&U”是否成立?

如何在不复制的情况下将Int32Array转换为Uint8Array

如何在不复制到CPU内存的情况下将ffmpeg纹理转换为Open GL纹理

如何在不复制的情况下将字节数组转换为整数数组

我可以从&[u32]中滤除特定数字并将其转换为Vec <u32>吗?

有没有一种方法可以将“ Vec <Vec <T >>”转换为“ Vec <T>”,将所有的“ Vec <T>”组合成一个“ Vec <T>”?

如何将Expression <Action <T,object >>转换为Expression <Action <T,U >>?

如何将 Vec<Item> 转换为 Vec<String>?