Vector Can';我不会使用Vec两次,我可以';我不能借它
我试图实现Rosetta代码密码生成器: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
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谢谢您的建议。我还没有想到这一点!!非常感谢。我想我将使用字符串来代替。