如何“使用”函数作用域结构?

Tid*_*ddo 7 rust

考虑以下人为的示例:

mod Parent {
    fn my_fn() {
        struct MyStruct;

        mod Inner {
            use super::MyStruct; //Error: unresolved import `super::MyStruct`. No `MyStruct` in `Parent`
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我如何MyStruct从内部模块导入这里?


动机

虽然上面的代码是您永远不会手动编写的,但生成它是有用的。现实世界的用例是派生宏。假设我想要这个:

#[derive(Derivative)]
struct MyStruct;
Run Code Online (Sandbox Code Playgroud)

现在,将生成的代码隔离在其自己的模块中,将生成的代码与源代码隔离(例如,避免命名冲突、use声明泄漏等)非常有用。所以我希望生成的代码是这样的:

mod _Derivative_MyStruct {
    use super::MyStruct;
    impl Derivative for MyStruct { }
}
Run Code Online (Sandbox Code Playgroud)

但是,如果在函数中定义结构体,则由于顶部的问题,上面的示例将失败。例如,这不起作用:

fn my_fn() {
    #[derive(Derivative)];
    struct MyStruct;
}
Run Code Online (Sandbox Code Playgroud)

当它扩展为:

fn my_fn() {
    #[derive(Derivative)];
    struct MyStruct;
    mod _Derivative_MyStruct {
        use super::MyStruct; // error
        impl Derivative for MyStruct {}
    }
}
Run Code Online (Sandbox Code Playgroud)

这对于文档测试来说尤其麻烦,因为它们隐式地包装在函数中。例如,这将给出未解决的导入问题:

/// Some interesting documentation
/// ```
/// #[derive(Derivative)]
/// struct MyStruct;
/// ```
Run Code Online (Sandbox Code Playgroud)

如果无法引用外部作用域,我要么需要放弃隔离,要么需要在调用站点包装在模块中。我想避免这种情况。

Cha*_*man 1

这是问题#79260。我认为没有解决办法。

const但是,您可以在未命名的( const _: () = { /* code */ };) 而不是模块内定义嵌套项。这可以防止名称冲突,并且是需要定义名称的宏中惯用的做法。但请注意,这无法const从外部引用内部的项目。