如何在 Rust 中使用多个文件?

12
如何在Rust中使用多个文件? 我的主要代码在file1.rs中。file2.rs多次运行file1.rs的主函数,这就是为什么我想把它拆分成两个文件来保持我的代码整洁。然后我只想在main.rs文件中运行file2.rs的主函数。(我正在使用最新版本的rust-2021)
文件夹结构:
├── Cargo.lock  
├── Cargo.toml  
├── src  
│  ├── main.rs  
│  └── file1.rs
|  └── file2.rs
└── target  

main.rs

pub mod file1;
pub mod file2;

pub fn main() {
    file2::main();
}

file2.rs

pub mod file1;

pub fn main() {
    file1::func("Bob");
    file1::func("Alice");
}

file1.rs

pub fn func(name: &str) {
    println!("Hello {}", name.to_string());
}

我收到了这个错误信息:
file not found for module `file1`
to create the module `file1`, create file "src/file2/file1.rs"
or "src/file2/file1/mod.rs" rustcE0583

当文件作为程序运行时,main函数是被执行的入口,不应该直接调用。请参考《The Rust Programming Language》中的"Managing Growing Protects"章节,了解如何组织Rust代码。 - Schwern
好的,谢谢。我已经在 file1 中将函数名更改为 func。但是导入错误仍然存在... - hups
1
找到答案了:https://dev59.com/XFYN5IYBdhLWcg3w1LIG。 - hups
这个回答是否解决了你的问题?如何在使用Cargo/Rust的模块中包含来自同一目录的文件? - Chayim Friedman
3个回答

5

您在这里说,file2.rs 有一个名为 file1 的模块,因此您的目录树应如下所示:

src
 |
  ---- main.rs
  ---- file2.rs
  ---- file2
        |
        ----- file1.rs

或者将它更改为:

main.rs:

pub mod file1;
pub mod file2;

// ...

file2.rs:

// pub mod file1

// ...

我有同样的问题。如果file1也被file3使用,那么第一种方法就不起作用了。然而,我也无法让第二种方法起作用。从main.rs调用的func运行得很完美,但是在从file2中使用它时,我会得到“未声明类型或模块file1的使用”。(我在主函数中使用了“pub mod file1”)。你有什么想法,可能出了什么问题吗? - FERcsI
@FERcsI 你的模块树具体是什么? - Rafaelplayerxd YT
我尝试了这里的方法。但我的问题是,我试图使用一个异构集合,并且我有一个Trait在一个单独的文件中,必须可以被集合处理器类以及派生类访问。所有这些都在不同的文件中,为了可维护性。作为一种解决方法,我发现super::file1::func有效(或者use super::file1)。也许这是期望的解决方案。 - FERcsI
1
如果你想从file2中使用file1(在file1属于“crate”的情况下),你需要使用super。 - Rafaelplayerxd YT
现在想一想,你在 main 和 file2 中都声明了 file1,如果你只想从 file2 中使用 file1,你可以这样做:use super::file1::*; 其中的 super 可以是 crate,或者你可以直接导入 file1 或 main。 - Rafaelplayerxd YT

1

您需要使用pub fn main() {...}main函数公开。另外,您用于调用file1::main的语法无效,您需要提供实际值,例如1"foo"


是的,它仍然不能工作,对不起实际值我已经更改了问题并添加了错误消息。 - hups

0

你可以从同一目录中的其他模块(文件)进行导入:

use super::file2::*;

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