使用Vec宏创建特定数据类型的Vec的惯用方法是什么



类似let v = vec![1, 2, 3];的类型默认为i32,但我希望将类型指定为u8

一个替代方案是创建:

let v: Vec<u8> = vec![1, 2, 3];

let v: Vec<u8> = Vec::new();
v.push(1);
v.push(2);
v.push(3);

有没有更好的方法直接使用宏?在这两种情况下,我都需要声明一个变量。

有时,我需要在assert语句中使用向量。如果有一种方法可以避免创建变量,我可以写:

pub fn func1() -> &[u8] {
// return slice [1, 2, 3] of [u8];
}
assert_eq!(vec![1, 2, 3], func1());

在这种情况下,矢量的类型将自动推导出来。这编译得很好:

fn func1() -> Vec<u8> {
vec![1, 2, 3]
}
fn main() {
assert_eq!(func1(), vec![1, 2, 3]);
}

如果需要显式指定类型,可以执行类似vec![1u8, 2, 3]的操作

虽然我不确定这种方式的具体性,但我还是建议

vec![1, 2, 3] as Vec<u8>

或者只是按照建议定义一个宏:

macro_rules! tvec [
($t:ty; $($e:expr),*) => { vec![$($e as $t),*] as Vec<$t> }
];

并像tvec![u8; 1, 2, 3]一样使用它这也适用于空向量。这是一个操场的例子

最新更新