rust - 我可以从 fn 中的 mod 导入 super:: 吗?
问题描述
我意识到这是一件非常奇怪的事情,但我正在编写一个宏,我希望它可以在尽可能多的地方使用。采取以下代码:
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
上下文并直接进入 parent mod
。
有什么办法可以InnerTestStruct
从内部获得参考mod inner
吗?尤其是在事先不知道任何上下文的情况下(即想象内部的宏调用fn do_thing()
,它不会知道它在 fn 内部)
解决方案
有什么办法可以
InnerTestStruct
从内部获得参考mod inner
吗?
不,super
将指的是包含模块,而不是功能范围。InnerTestStruct
据我所知,没有可以命名的路径。
由于您特别提到了宏,因此Rust API 指南对这种确切情况提出了警告:
项目宏在允许项目的任何地方工作
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;
}
}
}
}
推荐阅读
- unity3d - 不可靠/令人困惑的 MRTK 按钮触摸注册行为 [Unity,Hololens2]
- reactjs - 响应式轮播,在 React 中更改移动设备上的 itemsToShow
- c++ - 如何在 VScode 中显示完整的错误消息?
- java - java.io.FileNotFoundException:类路径资源 [certs/dev/test.crt] 无法解析
- javascript - JS本地存储按钮编码
- javascript - 使用 R 将按钮添加到高图表中的导出菜单
- c++ - 我们现在应该总是依赖编译器优化吗?
- python - 从 3D 图中提取可绘制的 Matplotlib 2D 轴?
- postgresql - PostgreSQL 13 :: 错误:表'mydb'的权限被拒绝
- javascript - Javascript - 如何在 Vue.js 中搜索大写或小写?