Vector 如何访问作为基础类型的新类型向量

Vector 如何访问作为基础类型的新类型向量,vector,rust,casting,Vector,Rust,Casting,我有一个新类型: #[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)] pub struct Foo(pub u32); 和它们的一个向量: let v: Vec<Foo> = Vec::new(); 我假设编译器没有足够的聪明来优化它们,即使使用#[repr(transparent)]如果您不能更改Foo的定义,那么您就不能,因为无法保证Foo具有与u32相同的

我有一个新类型:

#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
pub struct Foo(pub u32);
和它们的一个向量:

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

我假设编译器没有足够的聪明来优化它们,即使使用
#[repr(transparent)]

如果您不能更改
Foo
的定义,那么您就不能,因为无法保证
Foo
具有与
u32
相同的内存表示形式

如果可以更改
Foo
的定义,则需要添加以下内容:

现在,您可以使用在
Foo
u32
之间进行转换:

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

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

共享对
Vec
的引用没有多大意义,因为您无论如何都不能对它进行变异。您可能需要一个切片,您可以使用
slice::from_raw_parts(v.ptr()作为*u32,v.len())获得该切片。这当然是非常不安全的,因为Rust将无法强制执行别名规则,您必须自己执行。@user4815162342您是对的,我很乐意放弃旧的Vec来创建新的。这会降低安全性,只要允许在类型之间进行强制转换。有关详细信息,请参见。在这种情况下,
Vec:::from_raw_parts
应等同于转换@Jmb是有效的,但它只允许在
不安全的
块或函数中使用,因此我将坚持使用
.iter().map()
,除非有安全的方法解决这个问题。@justinas这也需要
不安全的
,这并不理想。
u32_vec.iter().map(|x| Foo(*x)).collect()
#[derive(Debug, Clone, Copy, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
#[repr(transparent)]
pub struct Foo(pub u32);
let u32_val: u32 = mem::transmute(Foo(42));
let foo_val: Foo = mem::transmute(u32_val);