尝试初始化类型为的矢量时发生类型不匹配错误



我正在尝试创建一个msg_bytes缓冲区来存储数据。但在创建它时,我会遇到类型不匹配的错误。

use libflate::gzip::Decoder;
let mut f = std::fs::File::open("./20181002.bytes").unwrap();
let mut decoder = Decoder::new(&f).unwrap();
let mut msglen_bytes = [0u8; 4];
decoder.read_exact(&mut msglen_bytes).unwrap();
println!("msglen_bytes: {:?}", &msglen_bytes);
let length = u32::from_le_bytes(msglen_bytes);
let length_us = usize::try_from(length).unwrap();
println!("length: {}", length);
let mut msg_bytes = vec!(0u8, length_us, length_us);
let mut msg_bytes = [0u8; length_us]; // Option 2
decoder.read_exact(&mut msg_bytes).unwrap();
error[E0308]: mismatched types
--> src/main.rs:50:35
|
50 |     let mut msg_bytes = vec!(0u8, length_us, length_us);
|                                   ^^^^^^^^^ expected `u8`, found `usize`

如果我用选项2运行,我会得到:

error[E0435]: attempt to use a non-constant value in a constant
--> src/main.rs:51:31
|
47 |     let length_us = usize::try_from(length).unwrap();
|     ------------- help: consider using `const` instead of `let`: `const length_us`
...
51 |     let mut msg_bytes = [0u8; length_us];
|                               ^^^^^^^^^ non-constant value

您可能想要let msg_bytes = vec![0u8; length_us](注意0u8和长度之间的分号(。

vec!(0u8, length_us, length_us)尝试创建元素分别具有值0u8length_uslength_us的3元素矢量。由于所有矢量元素都必须是相同的类型,因此该语法无法编译。

选项2不编译,因为数组的大小必须在编译时确定。

最新更新