Rust中能否从函数内模块引用父函数定义的类型?
问题:函数内模块能否引用同函数内定义的类型?
出于好奇提出该问题,暂无实际应用场景。查阅Rust参考手册发现,允许在函数内部定义任意类型的条目,手册指出:‘条目的路径名称……对封闭条目(如函数)而言是私有的’。
示例代码:
pub fn main() { #[derive(Debug)] pub struct Foo; mod module { pub fn function() { println!("{:?}", Foo); } } module::function(); }
尝试编译时出现如下错误:
| 7 | println!("{:?}", Foo); | ^^^ not found in this scope
请问是否可以实现该引用?
解答:可以实现,需使用正确的路径引用
可以实现这个引用。Rust中函数内部定义的模块是独立作用域,无法直接访问外部函数作用域的条目,哪怕二者在同一个函数内。要访问Foo,需要通过指向外部函数作用域的路径来引用,比如使用super::Foo或者完整路径crate::main::Foo。
修改后的可行代码示例:
pub fn main() { #[derive(Debug)] pub struct Foo; mod module { pub fn function() { println!("{:?}", super::Foo); } } module::function(); }
或者使用完整路径:
pub fn main() { #[derive(Debug)] pub struct Foo; mod module { pub fn function() { println!("{:?}", crate::main::Foo); } } module::function(); }
原理是:函数内部的模块嵌套在函数作用域中,super关键字在这里指向包含该模块的main函数作用域,因此能访问到其中定义的Foo类型。虽然手册提到条目对封闭条目是私有的,但module和Foo同属main的内部条目,属于同一封闭作用域下的嵌套结构,通过正确路径即可访问私有条目。
内容的提问来源于stack exchange,提问作者felixinho
相关产品推荐
相关产品推荐

