我正在读一本关于Rust 的书,开始玩Rust macros.所有元变量类型都在这里进行了解释,并提供了示例,最后一个除外——tt
.根据这本书,这是一棵"单一的象征树".我很好奇,它是什么?它是用来做什么的?你能举个例子吗?
我正在读一本关于Rust 的书,开始玩Rust macros.所有元变量类型都在这里进行了解释,并提供了示例,最后一个除外——tt
.根据这本书,这是一棵"单一的象征树".我很好奇,它是什么?它是用来做什么的?你能举个例子吗?
这个概念的引入是为了确保宏调用中的内容正确匹配()
、[]
和{}
对.tt
将匹配任何单个标记or或任何一对括号/方括号/大括号with their content.
例如,对于以下程序:
fn main() {
println!("Hello world!");
}
象征树将是:
fn
main
()
{ println!("Hello world!"); }
println
!
("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)*)
匹配的分支,其中$fmt
是格式字符串,$($arg:tt)*
表示"所有其余的",只是转发到format_args!
.这意味着println!
不需要知道实际的格式,也不需要进行复杂的匹配.