无锡网站制作方案,网页如何设计,自建网站代理服务器,网站托管运营Rust的模块化要从Rust的入口文件谈起。
Rust的程序的入口文件有两个
如果程序类型是可执行应用#xff0c;入口文件是main.rs#xff1b;如果程序类型是库#xff0c;入口文件是lib.rs#xff1b;
入口文件中#xff0c;必须声明本地模块#xff0c;否则编译器在编译过…Rust的模块化要从Rust的入口文件谈起。
Rust的程序的入口文件有两个
如果程序类型是可执行应用入口文件是main.rs如果程序类型是库入口文件是lib.rs
入口文件中必须声明本地模块否则编译器在编译过程中会报该模块不存在的错误。这个规则在其它程序的编译中很少见。
怎么理解这个规则我来举一个例子 假设我们目录结构如下
src/components/mod.rstable_component.rsmodels/mod.rstable_row.rsmain.rs依赖关系如下即main.rs没有直接依赖table_row.rs
main.rs - table_component.rs - table_row.rs现在来看看模块之间的引用代码。 main.rs对table_component.rs的依赖对应的代码为
use components::table_component::TableComponent;table_component.rs对table_row.rs的依赖对应的代码为
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过来的同学。 -- src/main.rs:4:5
use components::table_component::TableComponent;^^^^^^^^^^ use of undeclared crate or module components上面的错误里中有“undclared crate or module这里其实就是在提醒我们这个components模块没有被声明。 很简单就是在main.rs的头部加上下面的代码。
mod components;OK如果你再次编译代码你会发现下面这个错误。 -- src/components/table_component.rs:1:12use 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
mod components;
mod models;把握好这个原则其它模块间的引用方式例如super, self都好理解了。