Macros tt元变量类型在Rust宏中的含义是什么?

Macros tt元变量类型在Rust宏中的含义是什么?,macros,rust,metaprogramming,rust-macros,Macros,Rust,Metaprogramming,Rust Macros,我正在读一本关于生锈的书,开始玩。所有元变量类型都在这里进行了解释,并提供了示例,最后一种除外–tt。根据这本书,这是一个“单一的令牌树”。我很好奇,它是什么?它是用来做什么的?您能提供一个示例吗?这是一个概念,用于确保宏调用中的内容正确匹配()、[]和{}对tt将匹配任何单个标记或任何一对括号/方括号/大括号及其内容 例如,对于以下程序: fn main() { println!("Hello world!"); } 令牌树将是: fn main () ∅ {println!(

我正在读一本关于生锈的书,开始玩。所有元变量类型都在这里进行了解释,并提供了示例,最后一种除外–
tt
。根据这本书,这是一个“单一的令牌树”。我很好奇,它是什么?它是用来做什么的?您能提供一个示例吗?

这是一个概念,用于确保宏调用中的内容正确匹配
()
[]
{}
tt
将匹配任何单个标记或任何一对括号/方括号/大括号及其内容

例如,对于以下程序:

fn main() {
    println!("Hello world!");
}
令牌树将是:

  • fn
  • main
  • ()
  • {println!(“你好,世界!”);}
    • println
    • (“你好,世界!”)
      • “你好,世界!”
每一个都形成一个树,其中简单的标记(
fn
main
等)是叶子,被
()
[]
{}
包围的任何东西都有一个子树。请注意,
不会单独出现在令牌树中:如果不匹配相应的
,则无法匹配

例如:

macro_rules! {
    (fn $name:ident $params:tt $body:tt) => { /* … */ }
}
将上述函数与
$name匹配→ main
$params→ ()
$body→ {println!(“你好,世界!”);}


标记树是要求最低的元变量类型:它匹配任何内容。它通常用于具有“不太在意”部分的宏,尤其是具有“头”和“尾”部分的宏。例如,
println!
宏具有与
匹配的分支($fmt:expr,$($arg:tt)*)
其中,
$fmt
是格式字符串,
$($arg:tt)*
表示“所有其余部分”这意味着
println!
不需要知道实际的格式,也不需要进行复杂的匹配。

为什么
println!
不使用
expr
呢?参数不都是表达式吗?@Tomas不,它们也可以替换所有的
“{foo}”
s。