关于Rust中use语句作用域范围及模块间作用域差异的技术疑问
关于Rust中use语句作用域范围及模块间作用域差异的技术疑问
我一直搞不懂Rust里use语句的作用域为什么和变量的作用域差这么大?尤其是为什么在新定义的模块里,之前的use语句就失效了?我写了一段参考官方文档改编的代码:
mod front_of_house { pub mod hosting { pub fn add_to_waitlist() {} } } use crate::front_of_house::hosting; fn foo() { } mod customer { pub fn eat_at_restaurant() { hosting::add_to_waitlist(); // 这里会报错,hosting不在作用域内 foo(); // 我之前以为这里能运行,但实际上编译不通过 } }
官方文档里针对这段代码的解释是:
注意,
use只会在它所在的特定作用域内创建路径别名。把eat_at_restaurant函数移到名为customer的新子模块后,这个模块属于和use语句不同的作用域,所以函数体无法编译。
那这里的“作用域”到底指的是什么?用大括号创建新作用域的时候,use语句并不会失效,函数定义也不会。我知道只有在定义新模块的时候才会出现这种情况,想请教两个问题:
- 为什么模块会导致这种差异?
- 这些规则在哪里有正式的定义说明?
编辑补充:我之前的问题里有个错误,函数定义和use语句的作用域表现其实几乎完全一致,具体可以看被采纳的答案。
备注:内容来源于stack exchange,提问作者dominikkoller
相关产品推荐
相关产品推荐

