在Rust中对数组/向量进行类型转换

19

在 Rust 中,将一个类型的数组或向量转换为另一个类型的常用方法是什么?期望的效果是

let x = ~[0 as int, 1 as int, 2 as int];
let y = vec::map(x, |&e| { e as uint });

但我不确定是否可以以更简洁的方式实现相同的效果,类似于标量类型转换。

我似乎在 Rust 手册或参考文献中找不到线索。谢谢提前。

2个回答

18

一般来说,您最好能得到与您所拥有的相似的(这会分配一个新的向量):

let x = vec![0, 1, 2];
let y = x.iter().map(|&e| e as u32).collect();

尽管如此,如果您知道要转换的内容的位模式相同(例如,将新类型结构体转换为其包装类型,或在uintint之间进行转换),则可以进行原地转换,这不会分配新向量(尽管这意味着旧的x无法访问):

let x = [0, 1, 2];
let y: [u32; 3] = unsafe { cast::transmute(x) };

(请注意,这是不安全的操作,可能会导致出现问题。)


谢谢。按照通常的函数式方式并使用“map”就足够了。 - Arets Paeglis
5
看起来这个答案需要更新以适应Rust的新版本(例如,不再有do关键字,我认为你需要在某个地方使用.iter().collect())。 - joe
更不用说现在我们有了适当的“Box”,而不是以前那个波浪线代表的东西。 - user11877195
@huon 这个能用来将一个较大的整数类型转换为向量吗? - user2284570
你的示例转换了一个数组,这是可以的,但你的话暗示你可以转换一个向量。这绝对是不允许的。唯一有效的方法是使用 from_raw_parts()。但更好的方法是使用 bytemuckcast_vec()。还要注意,转换数组将会复制(除非编译器优化掉),而转换切片虽然不是严格禁止的,但应该用指针转换来替代。 - Chayim Friedman

2
从 Rust 1.55 开始,可以使用 map() 方法简洁而安全地在类型之间转换数组:
let x = [1, 2, 3];
let x_i64 = x.map(i64::from);

这是特定于数组的,无法在Vec上工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接