rust - 如何从宏中的表达式参数中获取标识符?

标签 rust rust-macros rust-decl-macros

我有一个由变量定义的常量值:

const VAL: usize = 32;
我想做一个这样的功能:
macro_rules! valfn {
    ($val:expr) => {
        pub fn $val () -> () {   // here val needs to be a ident
            some_other_fn($val)  // here it needs to be a expr
        }
    };
}

valfn!(VAL);
如果我可以以一种或另一种方式对 ident 值进行一些操作以避免定义冲突,则可以加分。我可以用函数定义隐藏变量吗?可能不是...
const VAL: usize = 32;
valfn!(VAL); // creates: fn VAL()
或者
const VAL_: usize = 32;
valfn!(VAL_); // creates: fn VAL()

最佳答案

接受一个标记树,然后将其解释两次,一次为 ident一次作为 expr :

macro_rules! valfn {
    ($val:tt) => { valfn!(@ $val, $val); };
    (@ $vali:ident, $vale:expr) => {};
}
为避免名称冲突,请使用下面链接的众多解决方案之一。一个例子是粘贴箱:
use paste::paste; // 1.0.4

fn some_other_fn(_: usize) {}

const VAL: usize = 32;

macro_rules! valfn {
    ($val:tt) => { valfn!(@ $val, $val); };
    (@ $vali:ident, $vale:expr) => {
        paste! {
            pub fn [<$vali:lower _fn>]() {
                some_other_fn($vale);
            }
        }
    };
}

valfn!(VAL);

fn main() {
    val_fn();
}
也可以看看:
  • What does an @ symbol mean in a Rust declarative macro?
  • Is it possible to modify the case of a token inside of a macro?
  • Is it possible to declare variables procedurally using Rust macros?
  • Can a Rust macro create new identifiers?
  • 关于rust - 如何从宏中的表达式参数中获取标识符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65497550/

    相关文章:

    macros - 是否可以在一个箱子中同时包含程序宏和逻辑?

    rust - 如何匹配 Rust 宏中的特征?

    rust - 如何编写一个宏来显示文件和行号以及可变数量的参数?

    debugging - 如何查看导致我的编译错误的扩展宏代码?

    json - Rust使用Postgres JSON属性: cannot convert between the Rust type `alloc::string::String` and the Postgres type `jsonb`

    rust - 当 Option 为 None 时如何结束借用

    rust - 在 Rust 的宏中创建闭包环境

    rust - 如何在 Parity Substrate 自定义运行时中使用通用结构?

    reflection - 反射的惯用替代

    rust - 如何解析 Rust 宏中的单个标记