我意识到这是一件非常奇怪的事情,但我写的宏我想在尽可能多的地方可用。以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内部)
1条答案
按热度按时间bjg7j2ky1#
不,
super
将引用包含的 * 模块 *,而不是函数作用域。有什么方法可以从
mod inner
内部获得对InnerTestStruct
的引用吗?据我所知,没有路径可以命名
InnerTestStruct
。由于您特别提到了宏,Rust API指南警告不要出现这种情况:
Item宏可以在允许Item的任何地方工作
Rust允许将项目放在模块级别或更严格的作用域(如函数)中。项目宏在所有这些地方都应该像普通项目一样工作。测试套件应该至少在模块作用域和函数作用域中包含宏的调用。
作为一个简单的例子,这个宏在模块作用域中工作得很好,但在函数作用域中失败。
字符串
我所知道的唯一修复方法是引入另一个模块:
型
这个问题有issue #79260文件。一个帖子建议使用一个未使用的内部函数来引入一个作用域。