在 Rust 中,将一个类型的数组或向量转换为另一个类型的常用方法是什么?期望的效果是
let x = ~[0 as int, 1 as int, 2 as int];
let y = vec::map(x, |&e| { e as uint });
但我不确定是否可以以更简洁的方式实现相同的效果,类似于标量类型转换。
我似乎在 Rust 手册或参考文献中找不到线索。谢谢提前。
一般来说,您最好能得到与您所拥有的相似的(这会分配一个新的向量):
let x = vec![0, 1, 2];
let y = x.iter().map(|&e| e as u32).collect();
尽管如此,如果您知道要转换的内容的位模式相同(例如,将新类型结构体转换为其包装类型,或在uint
和int
之间进行转换),则可以进行原地转换,这不会分配新向量(尽管这意味着旧的x
无法访问):
let x = [0, 1, 2];
let y: [u32; 3] = unsafe { cast::transmute(x) };
(请注意,这是不安全的
操作,可能会导致出现问题。)
map()
方法简洁而安全地在类型之间转换数组:let x = [1, 2, 3];
let x_i64 = x.map(i64::from);
这是特定于数组的,无法在Vec上工作。
do
关键字,我认为你需要在某个地方使用.iter()
和.collect()
)。 - joefrom_raw_parts()
。但更好的方法是使用bytemuck
的cast_vec()
。还要注意,转换数组将会复制(除非编译器优化掉),而转换切片虽然不是严格禁止的,但应该用指针转换来替代。 - Chayim Friedman