考虑以下人为的示例:
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)
如果无法引用外部作用域,我要么需要放弃隔离,要么需要在调用站点包装在模块中。我想避免这种情况。