Vector 假设向量在初始化后是不可变的,那么如何正确初始化Rust中的向量?

Vector 假设向量在初始化后是不可变的,那么如何正确初始化Rust中的向量?,vector,rust,Vector,Rust,假设向量在初始化后是不可变的,那么在不使用mut关键字的情况下初始化向量的好方法是什么 例如: //nums是一个'i32'向量 //这里是用两端填充两个1 让mut填充:Vec=Vec![0;len_p]; 填充的[0]=1; 填充的[len_n+1]=1; 对于idx,nums.iter.enumerate中的&num{ 填充的[idx+1]=num; } //此后,“padded”将是只读/不可变的 否则,在我看来,标记padded mut(简单地初始化它)似乎是对不变性的浪费,因为我无法

假设向量在初始化后是不可变的,那么在不使用mut关键字的情况下初始化向量的好方法是什么

例如:

//nums是一个'i32'向量 //这里是用两端填充两个1 让mut填充:Vec=Vec![0;len_p]; 填充的[0]=1; 填充的[len_n+1]=1; 对于idx,nums.iter.enumerate中的&num{ 填充的[idx+1]=num; } //此后,“padded”将是只读/不可变的
否则,在我看来,标记padded mut(简单地初始化它)似乎是对不变性的浪费,因为我无法在初始化之后强制执行它。

在Rust中看到的一个常见习惯用法就是为此目的引入局部作用域

let padded: Vec<i32> = {
  let mut tmp: Vec<i32> = vec![0; len_p];
  tmp[0] = 1;
  tmp[len_n + 1] = 1;
  for (idx, &num) in nums.iter().enumerate(){
    tmp[idx + 1] = num;
  }
  tmp
};
在嵌套范围内,我们有一个称为tmp的局部变量,它是可变的。然后,当我们到达该范围的末尾时,我们将该向量的所有权传递给不可变变量padded。编译器可以自由地对正在发生的任何实际移动进行优化,这将编译成与您编写的一样高效的内容。但从借阅检查器的角度来看,tmp是可变的,padded是不可变的,正如所希望的那样。一旦tmp超出范围,就无法再修改padded了


请记住,值的所有者总是决定该值是否可变,因此,当您将所有权传递给其他人时,他们可以在获得所有权后自由更改该值的可变性。

Rust中的一个常见习惯用法就是为此目的引入局部范围

let padded: Vec<i32> = {
  let mut tmp: Vec<i32> = vec![0; len_p];
  tmp[0] = 1;
  tmp[len_n + 1] = 1;
  for (idx, &num) in nums.iter().enumerate(){
    tmp[idx + 1] = num;
  }
  tmp
};
在嵌套范围内,我们有一个称为tmp的局部变量,它是可变的。然后,当我们到达该范围的末尾时,我们将该向量的所有权传递给不可变变量padded。编译器可以自由地对正在发生的任何实际移动进行优化,这将编译成与您编写的一样高效的内容。但从借阅检查器的角度来看,tmp是可变的,padded是不可变的,正如所希望的那样。一旦tmp超出范围,就无法再修改padded了

请记住,值的所有者总是决定该值是否可变,因此当您将所有权传递给其他人时,他们可以在获得所有权后自由更改该值的可变性。

有三种方法:

最有效的FP方法:使用collect 设v:Vec=std::iter::once1.chain 国际热核实验堆 收集 在范围中初始化。当您需要一些额外的变量时非常有用,这些变量将在此之后被清除。 设v={ 让mut v:Vec=Vec![0;len_p]; v[0]=1; v[len_n+1]=1; 对于&src,nums.iter.zipv[1...iter\u mut]中的dst{ *dst=src; } v } 重新绑定名称并将向量移到其中。当初始化清晰简单时非常有用。 让mut v:Vec=Vec![0;len_p]; v[0]=1; v[len_n+1]=1; 对于&src,nums.iter.zipv[1...iter\u mut]中的dst{ *dst=src; } //重新绑定到不可变变量 设v=v; //不能在这里变异 有三种方法:

最有效的FP方法:使用collect 设v:Vec=std::iter::once1.chain 国际热核实验堆 收集 在范围中初始化。当您需要一些额外的变量时非常有用,这些变量将在此之后被清除。 设v={ 让mut v:Vec=Vec![0;len_p]; v[0]=1; v[len_n+1]=1; 对于&src,nums.iter.zipv[1...iter\u mut]中的dst{ *dst=src; } v } 重新绑定名称并将向量移到其中。当初始化清晰简单时非常有用。 让mut v:Vec=Vec![0;len_p]; v[0]=1; v[len_n+1]=1; 对于&src,nums.iter.zipv[1...iter\u mut]中的dst{ *dst=src; } //重新绑定到不可变变量 设v=v; //不能在这里变异 如果padded被认为是永远不变的,即不移动,然后在其他地方发生变异,那么通过调用tmp.into_boxed_slice(在作用域末尾)来创建其类型框也是一个好主意。如果padded被认为是永远不变的,即不移动,然后在其他地方发生变异,那么通过调用tmp.into_boxed_slice来创建其类型框也是一个好主意tmp.into_boxed_切片位于作用域的末尾。