List &引用;借来的价值活得不够长。”;当推入向量时

List &引用;借来的价值活得不够长。”;当推入向量时,list,vector,rust,List,Vector,Rust,我正在尝试对参数列表进行洗牌并输出它们 我不确定这是否是正确的方法,但听起来是个好主意:从args向量中删除元素,这样就不会重复,然后将其插入结果向量 extern板条箱兰德;//0.7.3 使用std::io; 使用std::cmp::Ordering; 使用std::env; 使用rand::Rng; fn main(){ 让mut args:Vec=env::args().collect(); 让mut result:Vec=Vec::with_capacity(args.capacity

我正在尝试对参数列表进行洗牌并输出它们

我不确定这是否是正确的方法,但听起来是个好主意:从args向量中删除元素,这样就不会重复,然后将其插入结果向量

extern板条箱兰德;//0.7.3
使用std::io;
使用std::cmp::Ordering;
使用std::env;
使用rand::Rng;
fn main(){
让mut args:Vec=env::args().collect();
让mut result:Vec=Vec::with_capacity(args.capacity());
如果args.len()大于1{
println!(“有{}个参数)”,args.len()-1)
}
对于args.iter()中的x。跳过(1){
设mut n=rand::thread_rng().gen_range(1,args.len());
结果.推送(&args.swap_remove(n));
}
对于结果中的y.iter(){
println!(“{}”,y);
}
}
我得到一个错误:

错误[E0716]:借用时丢弃的临时值
-->src/main.rs:18:22
|
18 |结果推送(&args.swap_remove(n));
|^^^^^^^^^^^^^^^^^^^^^^^^^-在该语句末尾释放临时值
|                      |
|创建在仍在使用时释放的临时文件
...
21 |结果中的y。iter(){
|----借来以后用在这里
|
=注意:考虑使用一个“让”绑定来创建一个较长的生命值
老编辑说:

error[E0597]:借入值的有效期不够长
-->src/main.rs:18:42
|
18 |结果推送(&args.swap_remove(n));
|-----------------------^临时值已在此处删除,但仍处于借用状态
|                      |
|此处创建的临时值
...
24 | }
|-临时价值需要持续到此处
|
=注意:考虑使用“让”绑定来增加其生命周期。

让我们从一个较小的示例开始。这被称为an,对于作为程序员的您和我们回答您的问题都非常有价值。此外,它还可以在计算机上运行,非常方便

fn main(){
让mut args=vec![“a”.to_string();
让mut result=vec![];
对于args.iter()中的{
设n=args.len()-1;//假设这是一个随机索引
结果.推送(&args.swap_remove(n));
}
对于结果中的y.iter(){
println!(“{}”,y);
}
}
出现问题的原因是,当您调用
swap\u remove
时,该项将移出向量并交给您-所有权将转移。然后获取对该项的引用,并尝试将该引用存储在
结果
向量中。问题是循环迭代结束后,该项会被删除,因为没有任何内容拥有它。如果允许您使用该引用,它将是一个悬空引用,指向无效内存。使用该引用可能会导致崩溃,因此生锈可以防止崩溃

直接的解决办法是不引用,而是将所有权从一个向量转移到另一个向量。比如:

用于args.iter()中的{ 设n=args.len()-1;//假设这是一个随机索引 结果.推送(参数swap_remove(n)); } 问题是你会

error[E0502]:无法将'args'作为可变项借用,因为它也是作为不可变项借用的
-->src/main.rs:7:21
|
5 | for uu在args.iter()中{
|              -----------
|              |
|不可变借用发生在这里
|不可变借用稍后在此处使用
6 |设n=args.len()-1;
7 |结果推送(args.swap_remove(n));
|^^^^^^^^^^^^^^^^^^^^^^^^^^^^此处发生可变借用
请参阅创建引用向量的迭代器的
args.iter
。如果更改了向量,迭代器将变得无效,并允许访问可能不存在的项,这将防止另一个潜在的崩溃

我并不是说这是一种很好的方法,但一种解决方案是在仍然有项目的情况下进行迭代:

while!args.为空(){
设n=args.len()-1;//假设这是一个随机索引
结果.推送(参数swap_remove(n));
}
我将使用以下方法解决整个问题:

使用rand::seq::SliceRandom;//0.8.3
使用std::env;
fn main(){
让mut args:Vec=env::args().skip(1.collect();
args.shuffle(&mut rand::thread_rng());
适用于y in&args{
println!(“{}”,y);
}
}

谢谢您的解释,我遇到了这两个错误。我现在对所有权有了更好的了解。在这种情况下,您是否可以将
用于iter()
以使迭代器可以是可变的?@Danny您试过了吗?它有效吗?如果您的意思是在args.iter()中对x说
,则为否,因为将对
的调用更改为\u iter()
将获得参数的所有权,然后您将无法删除参数或获取长度。