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的值,否则它根本无法处理来自用户输入的字符串。