Rust 中元组的求值顺序是什么?
What is the evaluation order of tuples in 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 强大的向后兼容性保证中推断出来。更改评估顺序可能会带来太多破损,以至于无法认真考虑。
我还希望允许优化器在安全的情况下进行更改。例如,如果元组中的表达式没有副作用,那么重新排序它们对用户是不可见的。
另请参阅:
元组元素可能有副作用,其中一些可能依赖于其他元素。考虑这个程序:
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 强大的向后兼容性保证中推断出来。更改评估顺序可能会带来太多破损,以至于无法认真考虑。
我还希望允许优化器在安全的情况下进行更改。例如,如果元组中的表达式没有副作用,那么重新排序它们对用户是不可见的。
另请参阅: