【问题标题】:Create data model with multiple files in rust使用 rust 中的多个文件创建数据模型
【发布时间】:2024-04-20 05:40:02
【问题描述】:

我想在 rust 中创建以下数据模型。

在其他语言中,为每个结构创建一个文件是正常的。我创建了以下文件结构:

.
│
┝ data_model
│   │
│   ┝ mod.rs
│   ┝ house.rs
│   └ garage.rs
│
└ main.rs

我需要garage 结构中的房屋列表和house 结构中的车库列表。但我不能包含这些文件。我是这样试的:

main.rs:

mod data_model;
...

mod.rs:

mod house;
mod garage;

效果很好。我可以使用主文件中的结构。

但如果我这样做(mod.rs 和 main.rs 没有改变):

garage.rs:

mod house;

struct garage{
    houses: Vec<house>
}

它不起作用,因为 rust 搜索文件 data_model/garage/house.rs 而不是只搜索 data_model/house.rs

但我不想将house.rs 移动到garage/house.rs,因为这样看起来,房子是农舍的一个组成部分。它也行不通,因为我还必须将花格包括在房子里,如果房子是花格的组成部分,那是行不通的。

创建这样的数据模型的正确方法是什么?

PS:我知道存在一些问题,因为我不使用指针来指代从房子到车库和从车库到房子。但这不是目前的问题。

【问题讨论】:

  • 在 Rust 中创建递归结构非常困难,这是你真正想要的吗?
  • "在其他语言中,为每个结构创建一个文件是正常的。"但不是在 Rust 中,每个文件创建一个模块,并且模块通常包含相互关联的东西。

标签: rust


【解决方案1】:

garage.rs 中的mod house; 不起作用,因为house 不是车库的子模块。

你真正想要的是user super::house; in garage.rs

但是请注意,在 Rust 中不是习惯于为每种类型创建一个文件,并且在学习一门新语言时不应该尝试盲目地遵循其他语言的习惯用法。每种类型有一个文件是可能的,但不值得努力。更常见的做法是在模块中对类型进行分组,并以逻辑方式拆分文件,同时在同一个文件中协同工作。您也没有遵循 Rust 的命名约定(例如,类型应该是 CamelCase)。

【讨论】:

  • 谢谢。我已经预料到一个文件就是要走的路。但我不知道,如果那是惯例。还要感谢您的 CamelCase 提示。文件名是 rust 中的 snake_case 不是吗? rust 中是否有任何约定列表?
  • @NelDav There is!compiler gives warnings 如果您不遵守约定。作为初学者,您不应忽略它们,因为它们非常有用。 Clippy 也有一些很好的学习如何编写惯用的 Rust。