如何通过宏将字符串转换为原始字符串?

时间:2018-08-10 09:42:36

标签: rust

我有一个行示例"one two free",我需要通过编程将其通过宏转换为r#"one two free"#,这可能吗?

#[macro_export]
macro_rules! fmt_wrap {
    ($msg:block) => {

    }
}

fn main() {
    println!(fmt_wrap!("one two free"));
}

1 个答案:

答案 0 :(得分:10)

您不能。

原因很简单:示例宏(您用macro_rules!声明的内容)处理令牌流,而不是字符流。宏调用的输入必须是有效的令牌流。这意味着编译器必须在扩展任何宏之前将代码标记化。但是普通字符串文字"foo"和原始字符串文字r#"foo"#之间的区别只是在标记化期间!字符串文字是一个标记。

这意味着:

fmt_wrap!("foo " bar");

永远不会工作。在扩展fmt_wrap之前,编译器必须将其输入转换为有效的令牌流。但这是不可能的!