rust - Rust 中元组的求值顺序是什么?
问题描述
元组元素可能有副作用,其中一些可能依赖于其他元素。考虑这个程序:
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 = 1
?Rust Playground上的几轮表明前者在稳定的 1.32.0 上,但如果我运行它更多次,重新编译编译器,更改编译器版本等,它可能会改变。
是否有书面承诺或至少打算维持对元组的特定评估顺序(例如深度优先和从左到右)?
解决方案
是的,元组的评估顺序保证是从左到右的(这也意味着深度优先,因为必须完全构造值)。
不幸的是,这从来没有在我能找到的任何地方明确说明,但可以从 Rust 强大的向后兼容性保证中推断出来。对评估顺序进行更改可能会引入太多的破坏,以至于无法认真考虑。
我还希望优化器可以在安全的情况下进行更改。例如,如果元组中的表达式没有副作用,那么重新排序它们对用户是不可见的。
也可以看看:
推荐阅读
- python - 模型中数组的输入数据格式问题
- python - 如何将 else 语句添加到 dict 理解中?
- c++ - 程序在带有 3 个变量 C++ 的 while 循环中保持循环
- akka - akka java应用程序中aws s3的预签名URL
- node.js - 我想安装时出错( npm i --global @adonisjs/cli )
- elasticsearch - ES中的discovery.seed_hosts和cluster.initial_master_nodes是什么意思
- android - 在 Azure 管道上运行 Android 模拟器存在性能问题
- intellij-idea - PyCharm 错误:“无法设置 IntelliJ 主题:null”
- javascript - 使用 react native 和 firebase firestore 计算喜欢的数量
- react-native - joinChannelWithUserAccount 间歇性抛出错误“请求被拒绝”