Rust的模块化

Rust的模块化要从Rust的入口文件谈起。

Rust的程序的入口文件有两个

  1. 如果程序类型是可执行应用,入口文件是main.rs
  2. 如果程序类型是库,入口文件是lib.rs

入口文件中,必须声明本地模块,否则编译器在编译过程中,会报该模块不存在的错误。这个规则,在其它程序的编译中很少见。

怎么理解这个规则,我来举一个例子:

假设我们目录结构如下:

bash 复制代码
src/
  components/
    mod.rs
    table_component.rs
  models/
    mod.rs
    table_row.rs
  main.rs

依赖关系如下,即main.rs没有直接依赖table_row.rs

bash 复制代码
main.rs -> table_component.rs -> table_row.rs

现在来看看模块之间的引用代码。

main.rs对table_component.rs的依赖,对应的代码为

rust 复制代码
use components::table_component::TableComponent;

table_component.rs对table_row.rs的依赖,对应的代码为

rust 复制代码
use crate::models::table_row::TableRow;

上面的依赖代码都没毛病。在main.rs中"use components::table_component::TableComponent"这段代码告诉编译器,从模块的根部找components模块,因为components是一个文件夹,所以components目录下有一个mod.rs,然后在components文件夹下找table_component模块,最后在table_component模块中找到TableComponent。

因为table_component.rs中使用到了models中定义的TableRow,所以,这行代码也没有毛病:"use crate::models::table_row::TableRow"。这行代码告诉编译器从模块的根目录找models模块,然后在models模块中找table_row模块,最后在table_row中找到TableRow。

但是如果仅仅是这样,编译器就会马上送上模块找不到的错误。这种错误对于才接触到Rust的同学来说,可能很难发现,尤其是才从别的开发语言(比如Javascript)过来的同学。

bash 复制代码
 --> src/main.rs:4:5
use components::table_component::TableComponent;
     ^^^^^^^^^^ use of undeclared crate or module `components`

上面的错误里中有"undclared crate or module",这里其实就是在提醒我们这个components模块没有被声明。

很简单,就是在main.rs的头部加上下面的代码。

rust 复制代码
mod components;

OK,如果你再次编译代码,你会发现下面这个错误。

bash 复制代码
 --> src/components/table_component.rs:1:12

 use crate::models::table_row::TableRow;
            ^^^^^^ could not find `models` in the crate root

如果没有把模块声明的原则放心上,这个提示会让人发狂,因为无论你检查多少次,你都会发现你的文件路径src/models/table_row.rs和模块的查找路径是对应的啊,为什么就找不到呢?

如果这里的报错还是能像之前那样用"use of undeclared crate or module"就好理解多了。要解决这个问题,其实也是将"mod models;"这行代码添加到main.rs中。即:

main.rs

rust 复制代码
mod components;
mod models;

把握好这个原则,其它模块间的引用方式,例如super, self都好理解了。

相关推荐
晓晓hh2 小时前
JavaSE学习——迭代器
java·开发语言·学习
Laurence2 小时前
C++ 引入第三方库(一):直接引入源文件
开发语言·c++·第三方库·添加·添加库·添加包·源文件
kyriewen112 小时前
你点的“刷新”是假刷新?前端路由的瞒天过海术
开发语言·前端·javascript·ecmascript·html5
014-code2 小时前
String.intern() 到底干了什么
java·开发语言·面试
421!3 小时前
GPIO工作原理以及核心
开发语言·单片机·嵌入式硬件·学习
摇滚侠3 小时前
JAVA 项目教程《苍穹外卖-12》,微信小程序项目,前后端分离,从开发到部署
java·开发语言·vue.js·node.js
楚国的小隐士3 小时前
为什么说Rust是对自闭症谱系人士友好的编程语言?
java·rust·编程·对比·自闭症·自闭症谱系障碍·神经多样性
@insist1233 小时前
网络工程师-生成树协议(STP/RSTP/MSTP)核心原理与应用
服务器·开发语言·网络工程师·软考·软件水平考试
野生技术架构师4 小时前
2026年牛客网最新Java面试题总结
java·开发语言
环黄金线HHJX.4 小时前
Tuan符号系统重塑智能开发
开发语言·人工智能·算法·编辑器