有没有办法从闭包内部返回函数?

34

我有以下简化的代码:

fn f() -> i32 {
    let a = some_result.unwrap_or_else(|_| {
        return 1; // want to return this value from f <-------------
    });
}

在这种特定的错误情况下,我希望能够从整个函数f中返回值1,但我无法从闭包内部弄清楚如何实现。

如果我改用match表达式,则可以正常工作,如下所示:

fn f() -> i32 {
    let a = match some_result {
        Ok(result) => result,
        Err(_)     => { return 1; },
    };
}

然而,这使得代码冗长,因为我有一个平凡的Ok匹配分支。


你可以使用 .unwrap_or(1) 直接返回 1。 - matiu
2个回答

23

没有。

闭包是底层的一种方法(一种函数类型)。您想要从任意深度的嵌套函数调用中退出父函数的能力。这种非局部流控制通常对程序员的健康和程序维护非常不利。


要解决您的问题:


3
有道理。我只是希望在闭包参数的情况下有类似于 Kotlin 的 return@ 的东西。 - sshashank124

2

我想向您展示一个技巧。

如果您为异常情况创建一个可变的变量,您可以在闭包中设置该值。然后,您可以使函数返回特定值。

fn f() -> i32 {
    let mut invalid: bool = false; // + It is for the exception case

    let a = some_result.unwrap_or_else(|_| {
        // return 1; // want to return this value from f <-------------
        invalid = true; // + If the case is exceptional,
    });

    if invalid { // + If the value is marked, return specific value
        return 1;
    }
    ...
}

因为闭包是一种方法,所以没有确切的方法。

我想评论一下,这只是一个技巧。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接