有没有一种方法可以从代码块表达式中“返回”?

22

您可以使用return命令在到达函数的最后一条语句之前从函数中返回:

fn example() -> i32 {
    if true {
        return 1;
    }

    0 // this line is never reached
}

能否使用块表达式实现类似的功能呢?

let foo = {
    if true {
        // somehow "return" so that foo is 1
    }

    0 // this line is never reached
};

在这个例子中,我本可以使用 if-else,但我想要询问一般情况下的块表达式。


1
@AlexeyLarionov 因为在块表达式中使用 "return 1" 会从包含该表达式的整个函数返回,而不仅仅是该表达式。如果你问 "为什么不使用函数",那是因为可读性。 - Augustinas
4个回答

28

循环黑客技巧能否用于从合法内部循环中打破外部循环?类似于 break 'outer value; 这样的语句? - BallpointBen
@BallpointBen 不,你需要标签来实现。 - mcarton
FYI:cargo clippy 抱怨循环 hack;它说:“此循环实际上从不循环”。 - ynn
1
自 Rust 1.65.0 版本开始,您现在可以从带标签的块中跳出。https://blog.rust-lang.org/2022/11/03/Rust-1.65.0.html - ARN

11

你也可以使用立即调用的闭包。

fn main() {
    let foo = (|| {
        if true {
            return 1;
        }
        
        0
    })();
}

我的赌注是,LLVM在发布版本中足够聪明,可以优化掉函数调用。


这是一个不错的技巧。但是它是否存在需要将变量“移动”到闭包中的问题呢? - BallpointBen

6

编辑:这个功能已经在 Rust 1.65.0 中得到稳定


这个功能已经被提出:RFC 2046 - break label value。它使用break-label语法(用于循环)并作为不稳定功能可用。
因此,这将在夜间版编译器上工作:
#![feature(label_break_value)]

let foo = 'a: {
    if true {
        break 'a 1;
    }
    0
};

5

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