如何从宏中的表达式参数中获取标识符?
How do I get an identifer from an expression argument in a macro?
我有一个由变量定义的常数值:
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();
}
另请参阅:
- Is it possible to declare variables procedurally using Rust macros?
- Can a Rust macro create new identifiers?
在宏中,ident
是有效的 expr
,所以您可以只使用 ident
。
macro_rules! valfn {
($val: ident => {
pub fn $val () -> () {
some_other_fn($val)
}
};
}
您可以添加一个模块来避免命名冲突,或者 Shepmaster 的回答中的任何其他建议。
我有一个由变量定义的常数值:
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();
}
另请参阅:
- Is it possible to declare variables procedurally using Rust macros?
- Can a Rust macro create new identifiers?
在宏中,ident
是有效的 expr
,所以您可以只使用 ident
。
macro_rules! valfn {
($val: ident => {
pub fn $val () -> () {
some_other_fn($val)
}
};
}
您可以添加一个模块来避免命名冲突,或者 Shepmaster 的回答中的任何其他建议。