Rust中元组的评估顺序是什么?

Jak*_*ell 4 tuples operator-precedence language-specifications rust semantics

元组元素可能有副作用,其中一些可能依赖于其他元素.考虑这个程序:

fn main() {
    let mut v = vec![1, 2];
    match (v.pop(), v.pop()) {
        (Some(z), Some(y)) => println!("y = {}, z = {}", y, z),
        _ => unreachable!(),
    }
}
Run Code Online (Sandbox Code Playgroud)

是输出y = 1, z = 2还是y = 2, z = 1Rust Playground上的一些回合表明前者稳定在1.32.0,但如果我运行它多次,重新编译编译器,更改编译器版本等,它可能会改变.

是否有书面承诺或至少有意维持元组的特定评估顺序(例如深度优先和从左到右)?

She*_*ter 7

是的,元组的评估顺序保证是从左到右(这也意味着深度优先,因为值必须完全构造).

不幸的是,我从未在任何可以找到的地方明确说明,但可以从Rust强大的向后兼容性保证中推断出来.改变评估顺序可能会引入太多破损,以至于不必认真考虑.

我还希望优化器可以在安全的情况下进行更改.例如,如果元组中的表达式没有副作用,那么对用户来说重新排序它们是不可见的.

也可以看看:

  • 元组元素排序保留在[翻译为 HIR](https://github.com/rust-lang/rust/blob/6bba352cad2117f56353d400f71e96eafa2e6bd7/src/librustc/hir/lowering.rs#L3763-L3764) 中。然后从 [HIR 到 HAIR](https://github.com/rust-lang/rust/blob/6bba352cad2117f56353d400f71e96eafa2e6bd7/src/librustc_mir/hair/cx/expr.rs#L782) 转换后,元组可能是[从左到右评估] -right](https://github.com/rust-lang/rust/blob/6bba352cad2117f56353d400f71e96eafa2e6bd7/src/librustc_mir/build/expr/as_rvalue.rs#L206-L214) 生成 MIR Rvalue。 (2认同)