Я пытаюсь:
- Получить откуда-нибудь
Option<&str>
и построить из него PathBuf
. - Если
None
, напечатать сообщение иreturn. - Если путь не является каталогом, выведите сообщение о том, что путь не является каталогом, и вернитесь.
- Если все хорошо, продолжайте программу.
use std::path::PathBuf;
fn it_works() {
let path_str = Some("/tmp/abc");
let path = path_str.map(|s| PathBuf::from(s));
if !path.map_or(false, |p| p.is_dir()) {
match path {
Some(p) => println!("The folder {:?} is not a directory!", p),
None => println!("The repository folder is not set!"),
}
return;
}
}
Сопоставление с шаблоном в приведенном выше фрагменте не работает, поскольку значение было перемещено в комбинатор map_or
:
error[E0382]: use of moved value
--> src/lib.rs:8:18
|
5 | let path = path_str.map(|s| PathBuf::from(s));
| ---- move occurs because `path` has type `std::option::Option<std::path::PathBuf>`, which does not implement the `Copy` trait
6 | if !path.map_or(false, |p| p.is_dir()) {
| ---- value moved here
7 | match path {
8 | Some(p) => println!("The folder {:?} is not a directory!", p),
| ^ value used here after move
Я могу сделать что-то подобное, но это не очень "идиоматично" из-за unwrap
и нескольких if
предложений:
let path_str = Some("/tmp/abc");
let path = path_str.map(|s| PathBuf::from(s));
if path.is_none() {
println!("The repository folder is not set!");
return;
}
let p = path.unwrap();
if !p.is_dir() {
println!("The folder {:?} is not a directory!", p);
}
Можетможет быть лучше решить это?