如何 return 来自函数 Vec 的单个元素?
How to return a single element from a Vec from a function?
我是 Rust 的新手,我正在尝试创建一个界面,用户可以在其中通过从可用文件列表中键入文件名来选择文件。
这个函数应该return对应于所选文件的DirEntry
:
fn ask_user_to_pick_file(available_files: Vec<DirEntry>) -> DirEntry {
println!("Which month would you like to sum?");
print_file_names(&available_files);
let input = read_line_from_stdin();
let chosen = available_files.iter()
.find(|dir_entry| dir_entry.file_name().into_string().unwrap() == input )
.expect("didnt match any files");
return chosen
}
不过,chosen
好像是借来的?我收到以下错误:
35 | return chosen
| ^^^^^^ expected struct `DirEntry`, found `&DirEntry`
有什么办法可以“取消借用”它吗?或者我是否必须为 DirEntry
实施 Copy
特征?
如果这很重要我不关心这个方法之后的Vec
,所以如果“取消借用”chosen
破坏了Vec
,那我没问题(只要编译器同意)。
使用 into_iter()
而不是 iter()
这样您就可以从迭代器中获得拥有的值而不是引用。更改后代码将按预期编译和工作:
fn ask_user_to_pick_file(available_files: Vec<DirEntry>) -> DirEntry {
println!("Which month would you like to sum?");
print_file_names(&available_files);
let input = read_line_from_stdin();
let chosen = available_files
.into_iter() // changed from iter() to into_iter() here
.find(|dir_entry| dir_entry.file_name().into_string().unwrap() == input)
.expect("didnt match any files");
chosen
}
我是 Rust 的新手,我正在尝试创建一个界面,用户可以在其中通过从可用文件列表中键入文件名来选择文件。
这个函数应该return对应于所选文件的DirEntry
:
fn ask_user_to_pick_file(available_files: Vec<DirEntry>) -> DirEntry {
println!("Which month would you like to sum?");
print_file_names(&available_files);
let input = read_line_from_stdin();
let chosen = available_files.iter()
.find(|dir_entry| dir_entry.file_name().into_string().unwrap() == input )
.expect("didnt match any files");
return chosen
}
不过,chosen
好像是借来的?我收到以下错误:
35 | return chosen
| ^^^^^^ expected struct `DirEntry`, found `&DirEntry`
有什么办法可以“取消借用”它吗?或者我是否必须为 DirEntry
实施 Copy
特征?
如果这很重要我不关心这个方法之后的Vec
,所以如果“取消借用”chosen
破坏了Vec
,那我没问题(只要编译器同意)。
使用 into_iter()
而不是 iter()
这样您就可以从迭代器中获得拥有的值而不是引用。更改后代码将按预期编译和工作:
fn ask_user_to_pick_file(available_files: Vec<DirEntry>) -> DirEntry {
println!("Which month would you like to sum?");
print_file_names(&available_files);
let input = read_line_from_stdin();
let chosen = available_files
.into_iter() // changed from iter() to into_iter() here
.find(|dir_entry| dir_entry.file_name().into_string().unwrap() == input)
.expect("didnt match any files");
chosen
}