如何访问一个新类型的Vector作为基础类型



我有一个新类型:

#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
pub struct Foo(pub u32);

以及它们的载体:

let v: Vec<Foo> = Vec::new();

我需要将v作为Vec<u32>进行只读引用。

我怎样才能做到这一点而不浪费地制造一个新的矢量?

反过来呢?

我目前的解决方法包括创建一个新的矢量:

foo_vec.iter().map(|x| x.0).collect()
u32_vec.iter().map(|x| Foo(*x)).collect()

我认为编译器不够聪明,即使使用#[repr(transparent)]也无法优化这些。

如果不能更改Foo的定义,则不能更改,因为无法保证Foo具有与u32相同的内存表示。

如果您可以更改Foo的定义,那么您需要将#[repr(transparent)]添加到其中:

#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
#[repr(transparent)]
pub struct Foo(pub u32);

现在您可以使用std::mem::transmuteFoou32:之间进行转换

let u32_val: u32 = mem::transmute(Foo(42));
let foo_val: Foo = mem::transmute(u32_val);

不过,我不确定这是如何转化为Vec的。它可能会起作用,但我不认为它是有保证的(这可能是未定义的行为(。

相关内容

最新更新