我可以在Rust中包含"侧面"模块吗?

Rak*_*Rak 7 rust

我想将一个Rust程序拆分成多个文件,但使用时mod看不到允许我从其他文件引用同一目录中的文件main.rs.

例如,如果我有main.rs,game.rsmatrix.rs在同一文件夹,我可以从参考结构/功能game.rsmatrix.rsmain.rsmod game;mod matrix;.我不能,但是,参考matrix.rs来自game.rs与像一个声明mod matrix.

我查看了几个资源,所有这些资源只有像树一样的模块结构,而不是相互引用.是否可以在Rust中使用彼此文件中的结构/函数,还是违反规则?如果是这样,为什么Rust不让你这样做?

Vla*_*eev 12

mod模块声明.该指令声明了一个模块及其所有内容.恰好这些内容可能位于另一个文件中.所以这:

mod game;
mod matrix;
Run Code Online (Sandbox Code Playgroud)

大致相当于这个:

mod game {
    // game.rs contents
}

mod matrix {
    // matrix.rs contents
}
Run Code Online (Sandbox Code Playgroud)

当然,由于mod是模块的声明,因此对于同一模块,您不能多次执行此操作.也就是说,你可以尝试写一些类似的东西

mod game {
    mod matrix;
    ...
}

mod matrix;
Run Code Online (Sandbox Code Playgroud)

但是,正如您所看到的,matrix并且game::matrix是不同的模块,并且自然rustc需要不同的路径到它们各自的文件,如果它们是外部的.

use但是,是进口申报.use声明从其他模块中提取名称以在当前模块中使用.您可以use从该模块的任何位置随时随地访问任何模块和任何公共项目.

所以,为了参考matrixgame你需要use它:

// game.rs
use matrix;
Run Code Online (Sandbox Code Playgroud)

当然,为了使这个工作,matrix应该mod在箱子根目录中声明.

作为旁注,我个人认为理解Rust模块系统的最简单方法是首先忘记模块可以放在不同的文件中.也就是说,好像一个箱子只能在一个文件中定义.在Rust中,mod指令可以有实体并且可以嵌套,因此嵌套的mods实际上定义了一个包的模块系统:

mod foo {
    mod bax {
        ...
    }
    mod baz {
        ...
    }
}
mod bar {
    mod qux {
        mod zux {
            ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您只有一个文件,则可以轻松查看指令moduse指令的工作方式,并且模块之间的关系应该变得清晰.

现在你只需要在图片中添加这样一个事实,即如果一个模块声明没有正文,就像在mod name;其中一样,它的内容是从name.rs或者加载的,或者name/mod.rs是任何可用的.但是,完整的图片并没有丝毫变化 - 这些仍然是嵌套模块,它们总是可以表示为具有嵌套mod指令的单个源文件.实际上,cargo rustc -Z unstable-options --pretty=normal在外部源文件中的所有模块组装成单个文档之后,将以此形式打印您的包.我建议在一些具有复杂模块结构的板条箱上运行此命令,以了解它在实践中的外观.

  • @XavierT.C/C++和Rust之间的两个主要区别是,首先,Rust中的编译单元比C/C++中的编译单元大得多(一个crate,它对应于一个或多个.rs文件和一个或多个模块,而不是对象文件,它恰好对应于一个.c/.cpp文件,带有文本包含的头文件),其次,在Rust模块中实际提供命名空间和封装,对于C来说不是这样,对C++来说只是部分为真(其中名称空间确实存在) ,但不与编译单元绑定,也不提供抽象边界). (4认同)