退出块表达式?(类似于函数“返回”)

在到达最后一条语句之前从函数返回可以使用“return”来完成,例如:

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

    0 // this line is never reached
}

是否可以用块表达式做类似的事情?例子:

let foo = {
    if true {
        *something to exit with 1*
    }

    0 // this line is never reached
};

谢谢你的帮助。

PS我知道在这个简单的例子中我可以使用“if-else”表达式。我问的是一般的块表达式,而不是特别是这个例子:)

回答

对于稳定的 Rust,有一个众所周知的“ loophack”:

fn main() {
    let foo = loop {
        if true {
            break 1;
        }

        break 0;
    };
}

对于 nightly,有一个不稳定的功能label_break_value可以做到这一点:

#![feature(label_break_value)]

fn main() {
    let foo = 'bar: {
        if true {
            break 'bar 1;
        }

        0 // this line is never reached
    };
}

通过查看 Github 问题,此功能是否会稳定下来似乎并不明显。它已经实施了 2 年多,但似乎没有足够的支持者来推进。


回答

您还可以使用立即调用的闭包。

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

我敢打赌,LLVM 足够聪明,可以优化发布版本中的函数调用。


回答

我认为目前不可能,但我发现了这个跟踪问题:https : //github.com/rust-lang/rust/issues/48594


回答

不,没有机制可以提前从块中屈服。

有趣的是,已经提出了这种机制。尝试使用break-label语法(在循环中使用)这样做将导致错误:

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

所以这将适用于夜间编译器#![feature(label_break_value)]。但是,我不会因为它很快就会稳定下来而屏住呼吸。


以上是退出块表达式?(类似于函数“返回”)的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>