如何在 Rust 宏中引用外部范围项?

问题描述 投票:0回答:1

我正在编写一个

proc-macro
,它接收一个特征项并返回一些基于该特征的模块。

输入

#[my_macro]
pub trait MyTrait {
    // ...
    // ... fn items
    // ...
}

输出

pub mod my_mod_a {
    //...
}

pub mod my_mod_b {
    //...
}
// etc...

问题是,我有一个项目(结构体或枚举)定义在宏项目的外部,我想从生成的代码中引用它。

回到例子:

定义这样的东西,一个应用宏的特征项,以及可以在项目中任何范围的外部项,例如

crate::error::Error

// src/lib.rs

// enum for error handling defined by user what i want to refer from generated code
pub enum MyOuterEnum {
    GoodError,
    BadError,
}

#[my_macro]
pub trait MyTrait {
    
    // some function that return type would be transform into a result
    fn my_fn() -> u32;
}

How can I pass this element to the macro and thus refer to it?

举个例子,假设我想将函数

my_fn
的输出从
T
转换为
Result<T>
,那么我应该得到如下输出:

// possible output referencing the element outside the macro input item

pub mod my_generated_mod {
    pub trait MyTrait {
        // my function with return type changed
        fn my_fn() -> Result<u32, crate::MyOuterEnum>;
    }
}
rust macros metaprogramming
1个回答
0
投票

您可以在路径中使用

super
来引用父模块。

我并不是 100% 清楚你想在子模块中使用哪些项目,但你要么想要:

  • 每个项目的路径
    super::MyOuterEnum
    ,或
  • 通配符导入 -
    use super::*;
    - 将父级的所有内容包含到子级中
© www.soinside.com 2019 - 2024. All rights reserved.