我有一个行示例"one two free"
,我需要通过编程将其通过宏转换为r#"one two free"#
,这可能吗?
#[macro_export]
macro_rules! fmt_wrap {
($msg:block) => {
}
}
fn main() {
println!(fmt_wrap!("one two free"));
}
答案 0 :(得分:10)
您不能。
原因很简单:示例宏(您用macro_rules!
声明的内容)处理令牌流,而不是字符流。宏调用的输入必须是有效的令牌流。这意味着编译器必须在扩展任何宏之前将代码标记化。但是普通字符串文字"foo"
和原始字符串文字r#"foo"#
之间的区别只是在标记化期间!字符串文字是一个标记。
这意味着:
fmt_wrap!("foo " bar");
永远不会工作。在扩展fmt_wrap
之前,编译器必须将其输入转换为有效的令牌流。但这是不可能的!