从一个不是main.rs或lib.rs的文件中包含另一个文件

11
我是Rust的初学者,有三个文件:main.rs、board.rs和case.rs。 我想将case.rs包含到board.rs中,将board.rs包含到main.rs中,这样board就可以使用case,在main中也可以访问board。
我已经成功地将board添加到了main中,但我所做的方法似乎对第二部分不起作用。
我尝试将每个文件的内容都封装到“mod {}”中,但这并没有改变问题。 我也尝试了所有“mod”和“use”的组合。
每个文件都在src/文件夹中,如果可能的话,我希望它们不要移动。
main.rs
mod board;

fn main() {
    let mut b: Board = Board::new();
}

板子.rs

mod case;

pub struct Board {
    board: [ Case; 9 ]
}

// There is also the impl part of course, let's keep it short

case.rs

pub enum Case { Empty, Full(Player) }
使用带有 Rust 插件的 VSCode,在 board.rs 文件的第一行上,"case" 一词被下划线标红,并显示以下内容:
"src/case.rs file not found for module case help: name the file either board\case.rs or board\case\mod.rs inside the directory "src""
为什么它不在当前目录中搜索?

让我们简短明了一点吧 -- 你应该总是尝试提供 ReprEx - Peter Varo
1个回答

9
你的文件可能如下所示:
case.rs:
#[derive(Clone, Copy, Debug)]
struct Player;

#[derive(Clone, Copy, Debug)]
pub enum Case {
    Empty,
    Full(Player)
}

board.rs:

use crate::case::Case;

#[derive(Debug)]
pub struct Board {
    board: [ Case; 9 ]
}

impl Board {
    pub fn new() -> Self {
        Self { board: [Case::Empty; 9] }
    }
}

main.rs:

mod case;
mod board;

use crate::board::Board;

fn main() {
    println!("{:?}", Board::new());
}

基本上你创建一个 crate (一个二进制文件,因为你有一个 main.rs 文件),这个 crate 可以有模块。一个模块可以是一个文件,也可以是一个文件夹(如果它恰好有一个 mod.rs 文件)。 (为了完整起见,它还可以是与文件系统没有直接关系的 内联 模块。)

你的 mod 语句(指表示文件和文件夹的语句,而不是用于创建内联模块的语句)应该放置在你的 crate 的顶层(例如在你的 main.rslib.rs 中)或者在模块级别(在你的 mod.rs 文件中),具体取决于所需的结构。

如需更多信息,请阅读《The Rust Programming Language》书籍中相关章节:Packages and Crates


4
好的,我花了一些时间才明白在main.rs文件开头的“mod”调用有点像为其他文件注册模块。非常感谢,这很清晰! - Xobtah

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