< 返回版块

shenhunluo 发表于 2022-11-17 11:48

如下这个方法,是可以正常工作的

pub fn open_file<F>(f: F,file: &Option<String>) -> Result<File> 
    where F: Fn(&Path)->Result<File> {
    let file = match file {
        Some(file) => {
            let path = Path::new(file);
            f(path)
        },
        None => {
            做某些事情
            f(path)
        }

但是,如果把match换成map,闭包f中就没办法用path打开文件了,而且在闭包f中调用path的exists()方法也是可以正常工作的。 环境是stable-x86_64-pc-windows-gnu 版本1.65.0

评论区

写评论
苦瓜小仔 2022-11-17 17:55

以及更惯用的

    if let Some(Ok(file)) = path.as_deref().map(|s| f(s.as_ref())) {
        Ok(file)
    } else {
        f("Cargo.toml".as_ref())
    }

--
👇
苦瓜小仔: 你的代码逻辑上错误。

很难从你提供的破碎的代码中知道你想如何处理错误。

你可能想要这样:https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=a738fed7ccb2283686a132eee48a3dbe

苦瓜小仔 2022-11-17 17:31

你的代码逻辑上错误。

很难从你提供的破碎的代码中知道你想如何处理错误。

你可能想要这样:https://play.rust-lang.org/?version=stable&mode=debug&edition=2021&gist=a738fed7ccb2283686a132eee48a3dbe

作者 shenhunluo 2022-11-17 12:22

应该和惰性求值没关系,因为已经调用到了闭包f中的方法,不过打开文件的时候返回error,error是找不到这个文件,但是调用path.exists确返回true

--
👇
Neutron3529: map是惰性求值,你必须使用那个map才能得到正确结果。

Neutron3529 2022-11-17 12:11

map是惰性求值,你必须使用那个map才能得到正确结果。

1 共 4 条评论, 1 页