Rust 我可以从';fn里面有什么?

Rust 我可以从';fn里面有什么?,rust,Rust,我意识到这是一件非常奇怪的事情,但我正在写一个宏,我希望能在尽可能多的地方使用它。以: 由于使用super::InnerTestStruct行,因此无法编译。但是use super::OuterTestStruct行运行良好,因此我在这里的假设是super跳过fn上下文,直接转到父mod 有没有办法从内部mod inner获取对InnerTestStruct的引用?特别是在事先不知道任何上下文的情况下(例如,想象一下fn do_thing()中的宏调用,它不会知道它在fn中) 有没有办法从内部m

我意识到这是一件非常奇怪的事情,但我正在写一个宏,我希望能在尽可能多的地方使用它。以:

由于
使用super::InnerTestStruct
行,因此无法编译。但是
use super::OuterTestStruct
行运行良好,因此我在这里的假设是
super
跳过
fn
上下文,直接转到父
mod

有没有办法从内部
mod inner
获取对
InnerTestStruct
的引用?特别是在事先不知道任何上下文的情况下(例如,想象一下
fn do_thing()
中的宏调用,它不会知道它在fn中)

有没有办法从内部
mod inner
获取对
InnerTestStruct
的引用

否,
super
将指包含的模块,而不是功能范围。据我所知,没有路径可以命名
InnerTestStruct

由于您特别提到了宏,因此警告不要出现这种情况:

项宏在允许项的任何位置工作 Rust允许将项目放置在模块级别或更严格的范围内(如功能)。在所有这些地方,项宏应该与普通项一样工作良好。测试套件应至少在模块范围和功能范围内包含宏调用

macro_rules! broken {
    ($m:ident :: $t:ident) => {
        pub struct $t;
        pub mod $m {
            pub use super::$t;
        }
    } }

broken!(m::T); // okay, expands to T and m::T

fn g() {
    broken!(m::U); // fails to compile, super::U refers to the containing module not g
}
作为如何出错的一个简单示例,此宏在模块范围内工作良好,但在函数范围内失败

macro_rules! broken {
    ($m:ident :: $t:ident) => {
        pub struct $t;
        pub mod $m {
            pub use super::$t;
        }
    } }

broken!(m::T); // okay, expands to T and m::T

fn g() {
    broken!(m::U); // fails to compile, super::U refers to the containing module not g
}
我知道的唯一修复方法是引入另一个模块:

mod outer {
    struct OuterTestStruct {}

    fn do_thing() {
        mod middle { // <----------------
            struct InnerTestStruct {}

            mod inner {
                use super::super::OuterTestStruct;
                use super::InnerTestStruct;
            }
        }
    }
}
mod outer{
结构OuterTestStruct{}
fn do_thing(){

mod middle{//你可以把
mod
放在
fn
中。当你说“不编译”时,它会帮助你包含你得到的确切错误。