我正在阅读一本关于 Rust 的书,并开始玩Rust macros。所有元变量类型都在那里解释并有示例,除了最后一个-tt
。根据这本书,它是一个“单令牌树”。我很好奇,它是什么,它用于什么?你能提供一个例子吗?
这是为了确保宏调用中的任何内容正确匹配()
,[]
和{}
对而引入的概念。tt
将匹配任何单个标记或任何一对括号 / 括号 / 大括号及其内容。
例如,对于以下程序:
fn main() {
println!("Hello world!");
}
令牌树将是:
fn
main
()
{ 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)*)
匹配,其中$fmt
是的所有“格式字符串,$($arg:tt)*
本站系公益性非盈利分享网址,本文来自用户投稿,不代表边看边学立场,如若转载,请注明出处
评论列表(73条)