我正在尝试创建一个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)
尝试创建元素分别具有值0u8
、length_us
和length_us
的3元素矢量。由于所有矢量元素都必须是相同的类型,因此该语法无法编译。
选项2不编译,因为数组的大小必须在编译时确定。