< 返回版块

cybertheye 发表于 2024-04-12 20:34

Tags:rust,mod

正在看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

评论区

写评论
vSylva 2024-04-13 15:57

怀疑你没仔细看书

main 和 lib.rs 是 crate 的顶级,所以必须在二者中写 mod xxx;

全称量词 2024-04-12 22:52

按我的理解,mod 关键字是声明一个模块,和 let 声明一个变量类似。use 只是把模块名的作用域引入进来。

然后创建模块会自顶向下从 crate 或 lib.rs 开始按照模块声明的层次一层一层查找 模块声明 对应的同名文件。

你在 test2 里声明 test1 模块会让 test1 变为 test2 的子模块,错误提示也说要你在 test2 文件夹下创建一个 test1.rs 文件。

参照 rust reference 的模块小节容易理解一些:

模块的源文件名

module-source-filenames

1 共 2 条评论, 1 页