【发布时间】:2020-09-11 01:25:25
【问题描述】:
我在Constructors - The Rustonomicon 中找不到对此的任何引用。是不是保证下面的代码……
struct Mutates {
n: usize,
}
impl Mutates {
fn side_effects(&mut self) -> usize {
self.n += 1;
self.n
}
}
#[derive(Debug)]
struct Struct {
a: usize,
b: usize,
}
fn main() {
let mut m = Mutates { n: 0 };
// note the order of the fields
dbg!(Struct {
a: m.side_effects(),
b: m.side_effects(),
});
dbg!(Struct {
b: m.side_effects(),
a: m.side_effects(),
});
}
...总是会打印以下内容?
[src/main.rs:22] Struct{a: m.side_effects(), b: m.side_effects(),} = Struct {
a: 1,
b: 2,
}
[src/main.rs:26] Struct{b: m.side_effects(), a: m.side_effects(),} = Struct {
a: 4,
b: 3,
}
或者编译器是否可以分配不同的值?
请注意,问题是关于字段初始化而不是声明的顺序。
请注意,此问题专门询问 structs 而不是元组,What is the evaluation order of tuples in Rust? 已回答。
【问题讨论】:
-
有一个 4 年前的 reddit 线程:Question about execution order and struct initializers,还有 4 次测试(
struct-order-of-eval-1.rs、struct-order-of-eval-2.rs等) -
我真的希望顺序不依赖于在结构中声明字段的顺序,而只依赖于初始化字段的顺序......就像你的例子显示。这与函数参数从左到右计算的事实是一致的。
-
是的,不是声明它们的顺序,而是你在构造它的实例时指定它们的顺序。
-
@SCappella 我会说这不是重复的。元组更简单,因为字段的声明顺序和结构字面量中的字段顺序没有区别。
标签: struct rust initialization