Rust中同一结构体跨文件impl块调用私有方法报错求助
Rust中同一结构体跨文件impl块调用私有方法报错求助
嗨,我来帮你捋捋这个问题哈~
你遇到的function irq is private错误,核心原因是Rust的私有性规则是基于模块而非结构体的impl块。虽然irq和interrupt都是CPU结构体的方法,但irq定义在子模块b里,而且没有添加任何可见性修饰符,默认是模块私有——也就只有b模块内部能访问它,父模块a是拿不到的。
先再明确下你的代码结构:a.rs内容:
impl CPU { pub fn interrupt(&mut self) { self.irq(); // 这里触发报错 } } mod b;
b.rs内容:
use super::CPU; impl CPU { fn irq(&mut self) { // ... 你的业务逻辑 } }
给你两个实用的解决思路:
思路1:调整irq方法的可见性,让父模块能访问
如果你想保留跨文件的impl结构,可以给b.rs里的irq方法加上pub(super)修饰,让它对父模块a可见:
use super::CPU; impl CPU { pub(super) fn irq(&mut self) { // 新增pub(super)修饰 // ... 你的业务逻辑 } }
这样父模块a里的interrupt就能正常调用self.irq()了,同时这个方法对外(crate外)还是不可见的,能很好地保持封装性。
思路2:调整代码的模块/impl结构
如果不想修改方法可见性,也可以把两个方法归到同一个模块的impl块里:
- 要么把
irq的定义移到a.rs的CPUimpl块中 - 要么把
interrupt方法移到b.rs的CPUimpl块中
这样同一个模块内的impl块调用私有方法就完全没问题啦~
备注:内容来源于stack exchange,提问作者Petruza
相关产品推荐
相关产品推荐

