如何仅用mod语句构建含main.rs/dyn1.rs/dyn2.rs的Rust程序
Rust模块引用问题解答(仅用mod语句实现)
问题1:main.rs和dyn1.rs需添加哪些具体mod语句?
- main.rs:在文件顶部添加以下mod声明,将dyn1和dyn2声明为根模块的同级子模块:
mod dyn1; mod dyn2; - dyn1.rs:不需要添加
mod dyn2;。你之前尝试加mod dyn2;失败,是因为Rust默认会去src/dyn1/dyn2.rs找对应文件,而你的dyn2.rs在src根目录,路径不匹配;添加#[path="./dyn2.rs"]虽然能编译,但会让dyn1里生成一个独立于根模块的dyn2子模块,不符合你“dyn2不是dyn1子模块”的逻辑。正确做法是通过路径直接访问根模块的dyn2,无需重复声明。
问题2:main.rs中调用diag函数时,::前需填写什么内容?
填写dyn1,调用方式示例:
dyn1::diag(/* 传入参数 */);
问题3:main.rs函数中使用FIFTY常量时,::前需填写什么?
填写dyn2,写法示例:
let x = 3 + dyn2::FIFTY;
问题4:dyn1.rs函数中使用FIFTY常量时,::前需填写什么?
有两种符合要求的写法,都无需额外mod声明:
- 绝对路径:用
::dyn2(::代表根模块),写法:let x = 3 + ::dyn2::FIFTY; - 相对路径:用
super::dyn2(super代表父模块,即main),写法:let x = 3 + super::dyn2::FIFTY;
问题5:src目录是否可仅包含这三个文件?是否必须用子目录?
完全可以只在src目录下存放这三个文件,不需要子目录。Rust模块系统支持通过mod声明直接关联同级文件,子目录仅用于嵌套模块结构的场景,这里通过根模块声明同级模块、子模块通过路径访问根模块项的方式,完全不需要子目录。
问题6:该解决方案是否需要pub关键字?
需要,原因如下:
- dyn2.rs中的
FIFTY必须保持pub const(你已正确定义),否则其他模块无法访问这个常量; - dyn1.rs中的
diag函数必须声明为pub fn diag(...),否则main.rs无法调用该函数。
Rust模块内的项默认私有,只有标记pub才能被外部模块访问。
内容的提问来源于stack exchange,提问作者PaulCommentary
相关产品推荐
相关产品推荐

