在 Rust 中是否保证了 struct 字段的初始化顺序?

Lon*_*ami 7 struct initialization rust

我在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(),
    });
}
Run Code Online (Sandbox Code Playgroud)

...将始终打印以下内容?

[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,
}
Run Code Online (Sandbox Code Playgroud)

或者编译器是否可以分配不同的值?

请注意,问题是关于字段初始化的顺序,而不是声明的顺序。

请注意,这个问题专门询问结构而不是元组,由Rust 中元组的评估顺序是什么回答.

小智 5

是的,这是有保证的。拉尔夫·荣格,一个编译器团队贡献者确认它Zulip:

struct 字段的初始化顺序是否有保证?

拉尔夫:

是的 - 它始终是您在初始化程序中编写字段的顺序

结构体定义中字段的顺序无关紧要

截屏