我有一个新类型:
#[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::transmute
在Foo
和u32
:之间进行转换
let u32_val: u32 = mem::transmute(Foo(42));
let foo_val: Foo = mem::transmute(u32_val);
不过,我不确定这是如何转化为Vec
的。它可能会起作用,但我不认为它是有保证的(这可能是未定义的行为(。