Rust 创建向量并稍后分配时出现问题

Rust 创建向量并稍后分配时出现问题,rust,Rust,在阅读了大量文档之后,我发现我面临着一个范围问题,但我不知道如何解决它。请参见下面的示例代码: fn main() { let mut bytes_buf:Vec<u8> = Vec::new(); // 1) where I declare the Vector, the compiler force me to initialize it. loop { match socket.recv_from(&mut buf) { Ok((size

在阅读了大量文档之后,我发现我面临着一个范围问题,但我不知道如何解决它。请参见下面的示例代码:

fn main() {
  let mut  bytes_buf:Vec<u8> = Vec::new(); // 1) where I declare the Vector, the compiler force me to initialize it.

  loop {
    match socket.recv_from(&mut buf) {
      Ok((size, src)) => {
        if count == 0 {
          chunks_cnt = ...
          bytes_buf = vec![0; MAX_CHUNK_SIZE * chunks_cnt as usize]; // 2) where I want to set vector size, only ONCE, and after knowing chunks_cnt
        }
        bytes_buf[start..end].copy_from_slice(buf); // 3) where I want to gradually fill the vector
      }
    }
  }
}
fn main(){
让mut bytes_buf:Vec=Vec::new();//1)在我声明向量的地方,编译器强制我初始化它。
环路{
匹配套接字。从中接收(&mut buf){
正常((大小,src))=>{
如果计数=0{
块\u cnt=。。。
bytes_buf=vec![0;MAX_CHUNK_SIZE*chunks_cnt as usize];//2)在这里,我只想设置一次向量大小,并且在知道chunks_cnt之后
}
字节_buf[start..end]。从_slice(buf);//3)复制_,我想逐渐填充向量
}
}
}
}

为方便起见,您可以检查完整代码

可能的解决方案

在这里,套接字填充片
buf
。如果失败,将显示一条错误消息。如果成功,它将进入循环

在循环的每次迭代中,
buf
被转换为
Vec
,并附加到
bytes\u buf
。然后,如果这是第一次迭代,那么大小值将插入到第一个位置。然后将第一个标志设置为false。在此之后,所有迭代将继续向向量添加数据

下面的最小示例应该可以编译:

使用std::net:{UdpSocket};
常量UDP_头:usize=8;
const IP_头:usize=20;
const MAX_DATA_LENGTH:usize=(64*1024-1)-UDP_头-IP_头;
fn main(){
让socket=UdpSocket::bind(“0.0.0.0:8888”).expect(“无法绑定套接字”);
让mut buf=[0u8;MAX_DATA_LENGTH];//将由recv_从中填充的切片。
让mut bytes_buf:Vec=Vec::new();//将移动数据的向量。
让mut first=true;//指示这是否是我们的第一次迭代的标志。
环路{
匹配套接字。从中接收(&mut buf){
Ok((_size,_src))=>{
//将切片转换为向量(to_vec函数),并将其附加到字节。
字节追加(&mut buf.to_vec());
如果先{
//插入函数在指定位置插入元素并移动
//它后面的所有元素都在右边。
bytes_buf.insert(0,10u8);//IDK这里需要什么值。
}
first=false;//将first设置为false
},
Err(Err)=>eprintln!(“Error:{}”,Err)//如果失败,则显示错误。
}
}
}
旁注

您的示例缺少很多变量和上下文。尽管如此,我还是成功地创建了一个最小的工作示例,我相信您正努力实现这一目标,这要感谢您共享的链接,尽管您的链接非常不同。请下次提供一个最小的可复制示例。更多信息请点击此处:


祝你今天愉快

您提取的代码似乎不包含完整代码中的问题/您正在描述的问题。但这里有一个固定版本:您可能希望将其发布在Code Review stackexchange上,因为它可能更加惯用。感谢@Prime_Aqasix,我将尝试代码审阅,但我仍然认为我的问题是由于范围问题。您太好了,然而,如果你尝试了这个链接,你会注意到我已经设法用另一种方法解决了它(因此我无法回答我自己的问题)。我将选择并投票请求您的原谅并奖励您的努力:)