Rust模块导入报错:文件存在却提示找不到
Rust模块导入问题解析
问题根源:对mod关键字的误解
你在structure.rs里写mod fn_lib;时,Rust会认为你要在structure模块下创建一个名为fn_lib的子模块,因此会去查找src/structure/fn_lib.rs文件,这就是编译器提示你创建该文件的原因。
main.rs作为crate根模块,里面的mod fn_lib;是将fn_lib.rs声明为crate的直接子模块(即crate::fn_lib),所以能正常找到同级文件。当你通过main.rs里的mod structure;将structure.rs声明为crate的子模块后,structure就成为main的子模块(层级为crate::structure),此时structure内部的mod声明只会查找自己的子模块路径,而非和main同级的文件。
正确解决方法
要在structure.rs中使用fn_lib的内容,不需要再写mod fn_lib;,直接通过以下方式导入即可:
方法1:绝对路径(推荐)
直接引用crate根下的fn_lib模块:
// structure.rs use crate::fn_lib::*;
方法2:相对路径
利用super指代上级模块(即main)来引用:
// structure.rs use super::fn_lib::*;
移除main.rs中structure导入后能编译的原因
当你删掉main.rs里的mod structure;,structure.rs就不再属于当前crate——此时如果单独编译structure.rs(比如作为独立库文件),它会成为新的crate根,里面的mod fn_lib;会查找同级的fn_lib.rs,因此能正常编译。但这种情况下structure和main属于两个独立crate,自然无法被main.rs访问。
内容的提问来源于stack exchange,提问作者user23089382
相关产品推荐
相关产品推荐

