Rust 中元组的求值顺序是什么?

2024-01-04

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

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 or y = 2, z = 1?上几轮建议在稳定版 1.32.0 上使用前者,但如果我运行更多次、重新编译编译器、更改编译器版本等,它可能会改变。

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


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

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

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

也可以看看:

  • Rust 元组:求值顺序:左 -> 右? https://users.rust-lang.org/t/rust-tuple-evaluation-order-left-right/23917
  • Rust 参考:表达式 https://doc.rust-lang.org/reference/expressions.html
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rust 中元组的求值顺序是什么? 的相关文章

随机推荐