Rust 我是否可以将标识符传递给宏,但将宏;见;它所代表的数据是什么?

Rust 我是否可以将标识符传递给宏,但将宏;见;它所代表的数据是什么?,rust,metaprogramming,rust-macros,Rust,Metaprogramming,Rust Macros,规格: Rust nightly build 1.53.0 放松!板条箱依赖性 我正在构建一个简单的宏,以在属性名称作为字符串传入时调用结构上的属性,如下所示: 发送!(结构,“标题”);//=>结构标题有效 到目前为止,上述代码仍然有效,因为“title”是作为逐字字符串文字输入的。但是为了有用,我想为一个字符串文本传递一个my_str标识符,并将其视为我在上面传递的字符串文本(基本上类似于正常函数中的工作方式) my_str=“title” 发送!(struct,my_str);//=>

规格:

  • Rust nightly build 1.53.0
  • 放松!板条箱依赖性
我正在构建一个简单的宏,以在属性名称作为字符串传入时调用结构上的属性,如下所示:

发送!(结构,“标题”);//=>结构标题
有效

到目前为止,上述代码仍然有效,因为“title”是作为逐字字符串文字输入的。但是为了有用,我想为一个字符串文本传递一个
my_str
标识符,并将其视为我在上面传递的字符串文本(基本上类似于正常函数中的工作方式)

my_str=“title”

发送!(struct,my_str);//=>结构标题
不起作用

上面的代码给了我这个错误:

需要一个字符串文本,一个逐字
stringify呼叫,或逐字逐句
concat呼叫

这是发送的代码!我创建的宏

macro_rules! send {
    ($obj:ident, $msg:expr) => {
        unstringify!(
            let $x = unstringify!($msg) in {
                $obj . $x
            } 
        )
    }
}
如果上面的代码看起来很混乱,让我解释一下。这是在说,叫无组织!在
$msg
上,分配给
$x
,然后输出
$obj$x
作为最终结果。这不是两个自由化!电话(如有任何疑问,请参阅材料)


我知道其他宏,比如Rust的
println宏可以处理传入的文本或变量,并将它们视为相同的对象。我怎样才能在发送中实现这一点!宏?

这是不可能的。相反,您需要的是对字符串的值进行
匹配。
my_str
并不表示宏中的任何内容:它不是变量,只是标识符
my_str
。如果您想要在运行时设置变量的值,那么在编译时就无法获得它。您似乎想要反射。这实际上与宏无关。使用宏可以改变结构本身,使其具有执行映射的附加函数。但这将是结构类型定义上的宏,而不是调用上的宏。
println!(“{}”,my_str)
扩展到包含标识符的更多代码
my_str
。它不会在编译时计算my_str的值,否则它根本无法处理来自用户输入的字符串。