Rust 我可以从';fn里面有什么?
我意识到这是一件非常奇怪的事情,但我正在写一个宏,我希望能在尽可能多的地方使用它。以: 由于Rust 我可以从';fn里面有什么?,rust,Rust,我意识到这是一件非常奇怪的事情,但我正在写一个宏,我希望能在尽可能多的地方使用它。以: 由于使用super::InnerTestStruct行,因此无法编译。但是use super::OuterTestStruct行运行良好,因此我在这里的假设是super跳过fn上下文,直接转到父mod 有没有办法从内部mod inner获取对InnerTestStruct的引用?特别是在事先不知道任何上下文的情况下(例如,想象一下fn do_thing()中的宏调用,它不会知道它在fn中) 有没有办法从内部m
使用super::InnerTestStruct
行,因此无法编译。但是use super::OuterTestStruct
行运行良好,因此我在这里的假设是super
跳过fn
上下文,直接转到父mod
有没有办法从内部mod inner
获取对InnerTestStruct
的引用?特别是在事先不知道任何上下文的情况下(例如,想象一下fn do_thing()
中的宏调用,它不会知道它在fn中)
有没有办法从内部mod inner
获取对InnerTestStruct
的引用
否,super
将指包含的模块,而不是功能范围。据我所知,没有路径可以命名InnerTestStruct
由于您特别提到了宏,因此警告不要出现这种情况:
项宏在允许项的任何位置工作
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
}
作为如何出错的一个简单示例,此宏在模块范围内工作良好,但在函数范围内失败
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;
}
}
}
}
mod outer{
结构OuterTestStruct{}
fn do_thing(){
mod middle{//你可以把mod
放在fn
中。当你说“不编译”时,它会帮助你包含你得到的确切错误。