正在看mod,use,这一块内容,想要测试分一下模块
如图,这里我创建了一个工程,main.rs
,test1.rs
,test2.rs
在同级目录下
我的目的是在 test2文件中 引用 test1文件中的方法
test1.rs
pub fn test1_foo() {
println!("test1 foo");
}
test2.rs
mod test1;
use crate::test1::test1_foo;
pub fn test2_foo() {
test1_foo();
}
main.rs
mod test2;
fn main() {
test2::test2_foo();
}
但是 报错, bug info如下
-*- mode: compilation; default-directory: "~/Develop/Rust/modtest/" -*-
Compilation started at Fri Apr 12 20:25:06
cargo run --package modtest --bin modtest --
Compiling modtest v0.1.0 (/Users/mmmmmcclxxvii/Develop/Rust/modtest)
error[E0583]: file not found for module `test1`
--> src/test2.rs:1:1
|
1 | mod test1;
| ^^^^^^^^^^
|
= help: to create the module `test1`, create file "src/test2/test1.rs" or "src/test2/test1/mod.rs"
= note: if there is a `mod test1` elsewhere in the crate already, import it with `use crate::...` instead
error[E0432]: unresolved import `test1::test1_foo`
--> src/test2.rs:2:5
|
2 | use test1::test1_foo;
| ^^^^^^^^^^^^^^^^ no `test1_foo` in `test2::test1`
Some errors have detailed explanations: E0432, E0583.
For more information about an error, try `rustc --explain E0432`.
error: could not compile `modtest` (bin "modtest") due to 2 previous errors
Compilation exited abnormally with code 101 at Fri Apr 12 20:25:07
它说 test2.rs
不是和test1.rs
是同一级的吗,为什么 mod test1
会找不到?
还要我在 src/test2/xxx
这个级别下去创建 test1
模块
我还试了一下mod crate::test1
,显示
error: expected identifier, found keyword `crate`
--> src/test2.rs:1:5
|
1 | mod crate::test1;
| ^^^^^ expected identifier, found keyword
最终我试出来的解决方案是
在 main.rs
中
mod test1; //增加这个
mod test2;
fn main() {
test2::test2_foo();
}
在 test2.rs
中
//mod test1; //删除这行
use crate::test1::test1_foo;
pub fn test2_foo() {
test1_foo();
}
可以了, 不知道我的理解对不对,在main.rs
要加上 mod test1
才能建立由它开始的 crate
树
但是这样的话,岂不是很麻烦,我其他模块间要互相使用,我都得先在main.rs
中 “注册” 一下
所以我一定是哪里理解错了,麻烦请指点一下
工程 https://gitee.com/cybertheye/modtest.git
1
共 2 条评论, 1 页
评论区
写评论怀疑你没仔细看书
main 和 lib.rs 是 crate 的顶级,所以必须在二者中写 mod xxx;
按我的理解,mod 关键字是声明一个模块,和 let 声明一个变量类似。use 只是把模块名的作用域引入进来。
然后创建模块会自顶向下从 crate 或 lib.rs 开始按照模块声明的层次一层一层查找 模块声明 对应的同名文件。
你在 test2 里声明 test1 模块会让 test1 变为 test2 的子模块,错误提示也说要你在 test2 文件夹下创建一个 test1.rs 文件。
参照 rust reference 的模块小节容易理解一些:
模块的源文件名
module-source-filenames