gpt4 book ai didi

rust - 调用 Option::map 后如何使用值?

转载 作者:行者123 更新时间:2023-11-29 08:28:50 27 4
gpt4 key购买 nike

我正在尝试:

  1. 获取Option<&str>从某个地方,建立一个PathBuf
  2. 如果None ,打印一些消息,然后返回。
  3. 如果路径不是目录,打印一条消息说路径不是目录,然后返回。
  4. 如果一切顺利,继续该计划。
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);
}

有没有更好的方法来解决这个问题?

最佳答案

如果关闭在.map(...) (或 Option 上的任何类似功能)不需要选项中值的所有权(即它只需要对该值的引用),您始终可以使用 option.as_ref() option.as_mut() 转动 &Option<T>&mut Option<T>进入 Option<&T>Option<&mut T> .然后调用.map()不会取得所有权,因为引用是可复制的,所以它只是被复制到提供的闭包中。

考虑到这一点,您的代码将被修改为:

fn it_works() {
let path_str = Some("/tmp/abc");
let path = path_str.map(|s| PathBuf::from(s));
if !path.as_ref().map_or(false, |p| p.is_dir()) {
// ^^^^^^^^^ using .as_ref() here
// ^^^ now p is a '&PathBuf' instead of 'PathBuf'

match path {
// ^^^^ we didn't take ownership so compiler doesn't complain here

Some(p) => println!("The folder {:?} is not a directory!", p),
None => println!("The repository folder is not set!"),
}
return;
}
}

关于rust - 调用 Option::map 后如何使用值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56501746/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com