类似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]
一样使用它这也适用于空向量。这是一个操场的例子