rust 我可以从fn中的mod导入super::吗?

2hh7jdfx  于 12个月前  发布在  其他
关注(0)|答案(1)|浏览(72)

我意识到这是一件非常奇怪的事情,但我写的宏我想在尽可能多的地方可用。以following code为例:

mod outer {

    struct OuterTestStruct {}
    
    fn do_thing() {

        struct InnerTestStruct {}
        
        mod inner {
            use super::OuterTestStruct;
            use super::InnerTestStruct;
        }
    }
    
}

字符串
由于use super::InnerTestStruct行的存在,这段代码无法编译,但use super::OuterTestStruct行运行良好,因此我假设super跳过了fn上下文,直接进入父mod
有没有什么方法可以从mod inner内部获取InnerTestStruct的引用?特别是在事先不知道任何上下文的情况下(例如,想象一下fn do_thing()内部的宏调用,它不会知道它在fn内部)

bjg7j2ky

bjg7j2ky1#

不,super将引用包含的 * 模块 *,而不是函数作用域。
有什么方法可以从mod inner内部获得对InnerTestStruct的引用吗?
据我所知,没有路径可以命名InnerTestStruct
由于您特别提到了宏,Rust API指南警告不要出现这种情况:

Item宏可以在允许Item的任何地方工作

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
}

字符串
我所知道的唯一修复方法是引入另一个模块:

mod outer {
    struct OuterTestStruct {}

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

            mod inner {
                use super::super::OuterTestStruct;
                use super::InnerTestStruct;
            }
        }
    }
}


这个问题有issue #79260文件。一个帖子建议使用一个未使用的内部函数来引入一个作用域。

相关问题