Vector Can';我不会使用Vec两次,我可以';我不能借它

Vector Can';我不会使用Vec两次,我可以';我不能借它,vector,rust,move-semantics,borrowing,Vector,Rust,Move Semantics,Borrowing,我试图实现Rosetta代码密码生成器: extern crate rand; use rand::prelude::*; fn main() { println!("Hello, world!"); let p = generate_password(12, 5); for i in p.iter() { println!("{:?}", i); } } fn generate_password(length: i32, number: i

我试图实现Rosetta代码密码生成器:

extern crate rand;

use rand::prelude::*;

fn main() {
    println!("Hello, world!");
    let p = generate_password(12, 5);
    for i in p.iter() {
        println!("{:?}", i);
    }
}

fn generate_password(length: i32, number: i32) -> Vec<Vec<String>> {
    let lowercase = "abcdefghijklmnopqrstuvwxyz";
    let uppercase = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
    let listnumber = "0123456789";
    let other = "!\\\"#$%&'()*+,-./:;<=>?@[]^_{|}~";
    let all: Vec<char> = String::from(format!("{}{}{}{}", lowercase, uppercase, listnumber, other))
        .chars()
        .collect();
    let mut password: Vec<String> = Vec::new();
    let mut password_list: Vec<Vec<String>> = Vec::new();
    for num in 1..number {
        for l in 1..length {
            password.push(String::from(thread_rng().choose(&all).unwrap().to_string()));
        }
        password_list.push(&password);
    }
    return password_list;
}
extern板条箱兰德;
使用兰德::前奏::*;
fn main(){
println!(“你好,世界!”);
设p=generate_password(12,5);
国际热核聚变实验堆(iter)中的i{
println!(“{:?}”,i);
}
}
fn生成\u密码(长度:i32,编号:i32)->Vec{
let lowercase=“abcdefghijklmnopqrstuvxyz”;
让大写=“abcdefghijklmnopqrstuvxyz”;
让listnumber=“0123456789”;
让other=“!\\\\”\\$%&'()*+,-./:;?@[]^{124}~”;
let all:Vec=String::from(格式!(“{}{}{}{}}”,小写,大写,listnumber,其他))
.chars()
.收集();
让mut输入密码:Vec=Vec::new();
让mut password_list:Vec=Vec::new();
对于1..number中的num{
对于长度为1.的l{
password.push(字符串::from(thread_rng()。choose(&all).unwrap()。to_String());
}
密码\u列表。推送(&password);
}
返回密码列表;
}
Rust不允许我使用借来的价值或直接价值:

错误[E0308]:类型不匹配
-->src/main.rs:26:28
|
26 |密码_列表。推送(和密码);
|                            ^^^^^^^^^
|                            |
|应为结构'std::vec::vec',找到引用
帮助:考虑删除借记:“密码”
|
=注意:应为'std::vec::vec'类型`
找到类型“%std::vec::vec”`

“帮助”消息说,由于类型不匹配,我应该删除借用,但由于值已被移动,删除后仍会出错。

您已将一个类型声明为
Vec
,但尝试在其中存储引用

删除引用时,会出现另一个错误,因为
push
拥有该值的所有权,因此无法再使用原始变量。但随后尝试在后续循环中使用它。简单的解决方法是在循环中声明该变量,因此每次都是一个新变量:

let mut password_list = Vec::new();
for num in 1..number {
    let mut password = Vec::new();
    for l in 1..length {
        password.push(String::from(thread_rng().choose(&all).unwrap().to_string()));
    }
    password_list.push(password);
}

请注意,您不需要太多的类型注释,特别是在局部函数变量上。编译器可以推断它们,这使代码更干净。

与其使用
字符串,不如使用
&[u8]
,因为您不需要unicode来完成此操作。@PeterHall谢谢您的建议。我还没有想到这一点!!非常感谢。我想我将使用字符串来代替。