You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 22:13:28