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

时间:2019-01-22 17:16:19

标签: rust tuples semantics operator-precedence language-specifications

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

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

它输出y = 1, z = 2还是y = 2, z = 1Rust Playground上的几轮建议使用稳定版1.32.0,但如果我再运行几次,重新编译编译器,更改编译器版本等,它可能会改变。

是否有记录的承诺或至少打算维持元组的特定评估顺序(例如,深度优先和从左至右)?

1 个答案:

答案 0 :(得分:7)

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

不幸的是,这在我所能找到的任何地方都没有明确说明,但是可以从Rust强大的向后兼容性保证中推断出来。更改评估顺序可能会导致太多破坏,以至于无法认真考虑。

我还希望在安全的情况下允许优化程序进行更改。例如,如果元组中的表达式没有副作用,则用户看不到它们的重新排序。

另请参阅: