我正在阅读一本关于 Rust 的书,并开始使用Rust 宏。除了最后一个 - 之外,所有元变量类型都在此处进行了解释并提供了示例tt
。根据这本书,它是一个“单一的令牌树”。我很好奇,它是什么,它是用来做什么的?你能举个例子吗?
问问题
6859 次
1 回答
49
这是为了确保宏调用中的任何内容正确匹配()
,[]
和{}
对而引入的概念。tt
将匹配任何单个标记或任何一对括号/方括号/大括号与其内容。
例如,对于以下程序:
fn main() {
println!("Hello world!");
}
令牌树将是:
fn
main
()
- ∅</li>
{ println!("Hello world!"); }
println
!
("Hello world!")
"Hello world!"
;
每一个都形成一棵树,其中简单的标记(fn
等main
)是叶子,任何被()
,[]
或包围的东西{}
都有一个子树。请注意,(
它不会单独出现在令牌树中:如果(
不匹配相应的)
.
例如:
macro_rules! {
(fn $name:ident $params:tt $body:tt) => { /* … */ }
}
将上述函数与$name → main
, $params → ()
,匹配$body → { println!("Hello world!"); }
。
令牌树是要求最低的元变量类型:它匹配任何东西。它通常用于具有“不关心”部分的宏中,尤其是在具有“头”和“尾”部分的宏中。例如,println!
宏有一个分支匹配($fmt:expr, $($arg:tt)*)
where$fmt
是格式字符串,$($arg:tt)*
意思是“所有的其余部分”,只是转发到format_args!
. 这意味着println!
不需要知道实际格式并与之进行复杂的匹配。
于 2016-10-28T10:36:19.207 回答