Rust项目中跨文件结构体作为成员的类型错误求助
Rust模块内结构体引用错误求助与解决
问题背景
项目目录结构如下:
├── Cargo.lock ├── Cargo.toml ├── README.md ├── src │ ├── log_recorder │ │ ├── log_listener.rs │ │ ├── log_writer.rs │ │ └── mod.rs │ ├── main.rs │ └── utils.rs └── target
三个结构体分别定义在不同文件中,log_recorder结构体包含另外两个结构体:
src/log_recorder/mod.rs 代码
pub mod log_listener; pub mod log_writer; struct log_recorder { writer: log_writer, listener: log_listener, num_of_recorder_threads: u8, run: bool, } impl log_recorder { fn recording_loop(&self) { // Do Something } }
src/log_recorder/log_listener.rs 代码
pub struct log_listener { redis_client: i8, run: bool, } impl log_listener { fn listening_loop(&self) { // Do Something } }
src/log_recorder/log_writer.rs 代码
pub struct log_writer { fd: i8, } impl log_writer { fn write(&self) { // Do Something } }
编译时出现以下错误:
error[E0573]: expected type, found module `log_writer` --> src/log_recorder/mod.rs:6:13 | 6 | writer: log_writer, | ^^^^^^^^^^ not a type | help: consider importing this struct instead | error[E0573]: expected type, found module `log_listener` --> src/log_recorder/mod.rs:7:15 | 7 | listener: log_listener, | ^^^^^^^^^^^^ not a type | help: consider importing this struct instead |
查阅相关问题后仍未解决,寻求帮助。
问题原因与解决方法
核心原因
你在mod.rs中声明的log_writer和log_listener是模块,而非结构体类型。同名的结构体定义在这些模块内部,直接使用模块名会被编译器识别为模块而非类型,因此报错。
解决方式一:使用模块限定路径
修改mod.rs中的结构体定义,明确指定模块内的结构体:
pub mod log_listener; pub mod log_writer; struct log_recorder { writer: log_writer::log_writer, listener: log_listener::log_listener, num_of_recorder_threads: u8, run: bool, } impl log_recorder { fn recording_loop(&self) { // Do Something } }
解决方式二:导入结构体到当前作用域
在mod.rs中添加use语句,将模块内的结构体导入当前作用域,之后即可直接使用结构体名:
pub mod log_listener; pub mod log_writer; use log_listener::log_listener; use log_writer::log_writer; struct log_recorder { writer: log_writer, listener: log_listener, num_of_recorder_threads: u8, run: bool, } impl log_recorder { fn recording_loop(&self) { // Do Something } }
额外规范建议
Rust官方命名规范中,类型(结构体、枚举等)使用大驼峰(UpperCamelCase),模块名使用小蛇形(snake_case),这样能避免模块与类型同名带来的混淆。建议调整命名:
- 模块名保持
log_listener、log_writer - 结构体名改为
LogListener、LogWriter、LogRecorder
调整后的log_listener.rs:
pub struct LogListener { redis_client: i8, run: bool, } impl LogListener { fn listening_loop(&self) { // Do Something } }
对应的mod.rs:
pub mod log_listener; pub mod log_writer; use log_listener::LogListener; use log_writer::LogWriter; struct LogRecorder { writer: LogWriter, listener: LogListener, num_of_recorder_threads: u8, run: bool, } impl LogRecorder { fn recording_loop(&self) { // Do Something } }
内容的提问来源于stack exchange,提问作者lior.i
相关产品推荐
相关产品推荐

