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”将是只读/不可变的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(简单地初始化它)似乎是对不变性的浪费,因为我无法
否则,在我看来,标记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_切片位于作用域的末尾。