如何从src子文件夹中的文件导入?

16

我想把我的代码拆分成多个src子目录。例如:

src
  main.rs
  sorting_algorithms
    bubble.rs

bubble.rs包含一个名为bubble_sort的函数; 我该如何将其导入到main.rs中?

3个回答

21

子文件夹必须声明为模块。您可以使用以下三种不同的方式进行声明:

  • 内联方式:在main.rs中声明sorting_algorithms模块:

    // In main.rs:
    
    mod sorting_algorithms {
        pub mod bubble;
    }
    

    在我看来,这是最简单的方法。

  • 将一个名为sorting_algorithms.rs的文件放入src文件夹中,并加上模块声明:

  • // In sorting_algorithms.rs:
    
    pub mod bubble;
    
  • 将具有上述内容的mod.rs文件放入子文件夹中。不建议这样做,因为同时使用多个mod.rs文件可能会令人困惑。


使用第二种方法,你如何将它导入到 main.rs 中? - Lucassith
@Lucassith 这三种方法没有区别:你可以使用完整的名称 sorting_algorithms::bubble::sort,或者将其导入作用域:use sorting_algorithms::bubble::sort; 然后直接使用 sort - Boiethios
你能详细说明为什么mod.rs已被弃用吗?它会在某些版本中停止工作,还是因为某种原因被认为是不良实践? - ikamen
@ikamen 这不是最好的措辞:它并非被废弃意味着将不再受到支持。更多的是,团队建议不要使用它。 - Boiethios
明白了。但是为什么他们建议不要这样做呢?对我来说,这样做似乎很好,因为我不必在文件夹外放置任何东西,如__init__.py - ikamen
@ikamen,我更新了我的回答。如果你想让所有东西都是自包含的,我的建议是使用内联解决方案。 - Boiethios

10
只有在您为 src 的子文件夹添加 mod.rs 文件时,Rust 才会将其识别为模块。请将其添加到 sorting_algorithms 文件夹中:
src
  main.rs
  sorting_algorithms
    bubble.rs
    mod.rs

mod.rs文件可以将该文件夹的子模块暴露出来:

pub mod bubble;

假设函数bubble_sort被声明为公共函数(pub fn bubble_sort(...)),您可以从main.rs中使用它:
mod sorting_algorithms;
pub use sorting_algorithms::bubble::bubble_sort;

0

Rust中的模块可以帮助您以清晰和逻辑的方式组织代码。

假设您在项目中有以下文件结构:

.
├── Cargo.toml
└── src
    ├── main.rs
    ├── subfolder1
    │   ├── file1.rs
    │   ├── file2.rs
    │   └── subsubfolder
    │       └── file1.rs
    └── subfolder2
        └── file1.rs

并且你想在主文件 main.rs 中使用子文件夹内定义的函数。

为了实现这一点,你可以通过使用带有花括号的 mod 关键字,在 main.rs 文件中直接声明子文件夹作为模块,并列出子模块:

// This is src/main.rs

mod subfolder1 {
    pub mod subsubfolder {
        pub mod file1;
    }
    pub mod file1;
    pub mod file2;
}
mod subfolder2 {
    pub mod file1;
}

导入子模块的函数,需要使用use关键字和从根目录开始的完整模块路径。
// This can be any file

use crate::subfolder1::file1::fn1;
use crate::subfolder1::file2::fn2;
use crate::subfolder1::subsubfolder::file1::nestedfn;
use crate::subfolder2::file1::otherfn;

这种方法有一些优点:

  • 它允许子文件夹。您可以按照自己的喜好组织代码。
  • 它简单而简洁。您不需要创建任何额外的文件。
  • 它反映了文件结构。您可以轻松查看您拥有的模块,并导航到它们。
  • 它与Rust约定一致。Rust参考资料建议不要在项目中有很多名为mod.rs的文件。

可能的缺点:

  • 它可能会使您的main.rs文件变得过长和混乱。如果您有很多子文件夹和文件,您的main.rs文件将包含许多pub mod关键字和花括号,这可能会使其难以阅读和编辑。
  • 它需要频繁更新main.rs文件。如果您在子文件夹中添加了一个新模块,您需要编辑您的main.rs文件并使用mod关键字声明它,否则编译器将无法识别它。这可能会很繁琐,特别是如果您需要管理许多文件。
总结一下,这种方法是在Rust中使用模块的一种方式,而无需创建任何额外的文件。它有一些优点和缺点,取决于你的偏好和项目结构。你可以选择最适合你需求的方法,或者尝试其他方法,比如创建一个与模块同名的文件(subfolder.rs),或在子文件夹中创建一个mod.rs 文件。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接