Rust 中结构体的声明和定义有什么区别

cyb*_*org 4 rust

我不太了解 Rust 中“声明”和“定义”的定义。Rust 参考文献说结构体字段按声明顺序删除。这是否意味着按照结构最初创建时的顺序{?定义/声明?},

struct Example {
    x: i32,
    y: i32,
}
Run Code Online (Sandbox Code Playgroud)

或者当值实际添加到结构体 {?definition/declaration?} 时(其顺序可以与原始创建的顺序不同),

fn foo -> Example {
    Example {
         y: 43,
         x: 42,
    }
} 
Run Code Online (Sandbox Code Playgroud)

我不清楚哪一个是声明,哪一个是定义。

我试图在 y 掉落时打印一条消息,但我的代码无法编译。

kmd*_*eko 7

我认为 Rust 中的结构体两者之间没有区别。

在某些语言(如 C )中,声明类型存在(“有某种名为Example”的类型)和定义该类型的结构(“名为的类型Example具有字段xy”)之间可能存在差异。然而,Rust 中没有语法将它们分开,它们是同一个。Rust ReferenceRust Book似乎更喜欢将其称为“定义”,尽管析构函数的文档说得对,“结构体的字段按声明顺序删除”。

“声明的顺序”是您在结构定义中看到的内容。从而x之前就会被丢弃y。后一个示例是实例化一个结构体,如果文档意味着它会调用它“实例化顺序”、“初始化顺序”或类似的名称。


以上并不是说 Rust 中不存在这种区别,只是在结构方面不存在:

  • 对于特征,特征的定义可能仅包括关联函数的声明以及将由特征实现定义的其他项。
  • 当谈论引入变量时,您还可以看到“声明”的措辞,其中“定义”可以单独完成(例如let a; a = 5有效),尽管通常称为“初始化”而不是“定义”,但无论哪种方式您都会被理解。
  • 最终可能会有外部类型,它涉及类型的“声明”,但不涉及“定义”,因为它将用于对 Rust 外部定义的类型的不透明句柄。