Rust 宏中的 tt 元变量类型是啥意思?

     2023-02-19     129

关键词:

【中文标题】Rust 宏中的 tt 元变量类型是啥意思?【英文标题】:What does the tt metavariable type mean in Rust macros?Rust 宏中的 tt 元变量类型是什么意思? 【发布时间】:2017-03-11 03:59:00 【问题描述】:

我正在阅读一本关于 Rust 的书,并开始使用 Rust macros。除了最后一个 - tt 之外,所有元变量类型都在此处进行了解释并提供了示例。根据这本书,它是一个“单一的令牌树”。我很好奇,它是什么,它是用来做什么的?可以举个例子吗?

【问题讨论】:

【参考方案1】:

这是为了确保宏调用中的任何内容正确匹配 ()[] 对而引入的概念。 tt 将匹配任何单个标记任何一对括号/括号/大括号与其内容

例如,对于以下程序:

fn main() 
    println!("Hello world!");

令牌树将是:

fn main () println!("Hello world!"); println ! ("Hello world!") "Hello world!" ;

每一个都形成一棵树,其中简单的标记(fnmain 等)是叶子,而任何被 ()[] 包围的东西都有一个子树。请注意,( 不会单独出现在令牌树中:如果不匹配相应的 ),则无法匹配 (

例如:

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!不需要知道实际的格式,也不需要做复杂的匹配。

【讨论】:

为什么println! 不使用expr 代替?参数不都是表达式吗? @Tomas 不,他们也可以用named parameters like foo=expr 替换所有的"foo"s。

Rust 类型中的 & 符号是啥意思?

】Rust类型中的&符号是啥意思?【英文标题】:Whatdoestheampersand(&)before`self`meaninRust?Rust类型中的&符号是什么意思?【发布时间】:2015-11-0117:20:51【问题描述】:我在Rust文档中看到了这段代码:fneat(&self)println!("isdoneeati... 查看详情

宏中的波浪号 (~) 是啥意思?

】宏中的波浪号(~)是啥意思?【英文标题】:Whatdoesthetilde(~)inmacrosmean?宏中的波浪号(~)是什么意思?【发布时间】:2011-09-2215:43:21【问题描述】:在thissite上看到,代码显示使用括号中的波浪号的宏调用:HAS_COMMA(_TRIGGER_PARENTHESIS__... 查看详情

如何在宏中匹配 Rust 的“if”表达式?

】如何在宏中匹配Rust的“if”表达式?【英文标题】:HowtomatchRust\'s`if`expressionsinamacro?【发布时间】:2019-01-2617:07:02【问题描述】:我正在尝试编写一个将重写某些Rust控制流的宏,但我在匹配if表达式时遇到了困难。问题是谓词... 查看详情

rust-chrono 中的 ParseError(NotEnough) 是啥意思?

】rust-chrono中的ParseError(NotEnough)是啥意思?【英文标题】:WhatdoesParseError(NotEnough)fromrust-chronomean?rust-chrono中的ParseError(NotEnough)是什么意思?【发布时间】:2016-09-2122:56:14【问题描述】:我正在使用rust-chrono,我正在尝试解析这样... 查看详情

rust腐蚀里面ban宏是啥意思

参考技术Arust腐蚀里面ban宏意思如下让你可以发明自己的语法,编写出可以自行展开的代码,也就是我们通常所说的元编程,你甚至可以用Rust宏来创作自己的DSL。 查看详情

c语言中的整型变量是啥意思?求详解

整型变量,即整数型变量。包括有符号整数和无符号整数,从数据长度上分,包括短整数、整数、长整数。标准整数类型为int一般只说整形,通常是指这个,但其它整数类型也在简称整形变量的范围之内。包括的关键字有:shorti... 查看详情

元信息中的“CallCnvntn”是啥意思?

】元信息中的“CallCnvntn”是啥意思?【英文标题】:Whatdoes\'CallCnvntn\'inmetainfomean?元信息中的“CallCnvntn”是什么意思?【发布时间】:2017-08-1014:09:30【问题描述】:我的*.exe文件有以下元信息:但我不明白“CallCnvntn”是什么意思... 查看详情

js中的var是啥意思,

js中的var是定义变量的意思,使用和不使用var都能定义变量,但是两个变量的作用域不同。1、新建html文档,在body标签中添加script标签,使用var定义一个变量a并给变量赋值为10,将a在控制台输出,这时控制台会输出10:2、定义一... 查看详情

使用Alamofire时,元组类型的值没有成员验证是啥意思?

】使用Alamofire时,元组类型的值没有成员验证是啥意思?【英文标题】:WhenusingAlamofire,whatdoesvalueoftupletypehasnomembervalidatemean?使用Alamofire时,元组类型的值没有成员验证是什么意思?【发布时间】:2018-07-0113:56:36【问题描述】:... 查看详情

编程中的“原子”是啥意思?

】编程中的“原子”是啥意思?【英文标题】:Whatdoes"atomic"meaninprogramming?编程中的“原子”是什么意思?【发布时间】:2013-02-0920:04:06【问题描述】:在EffectiveJava一书中,它指出:语言规范保证读或写变量是原子的,除... 查看详情

c#中的“定义字符串变量”是啥意思。

...oat、一个byte、一个short、一个string等等多种不同数据类型中的任何一种类型。类型可指定应用程序运行时必须分配用于存储值的精确内存量,以及其他信息。这样你就会明白以下方式声明的变量str就是“字符串变量”:stringstr=&q... 查看详情

Rust 语言中的 &'a 是啥 [重复]

】Rust语言中的&\\\'a是啥[重复]【英文标题】:Whatis&\'ainRustLanguage[duplicate]Rust语言中的&\'a是什么[重复]【发布时间】:2018-05-1808:13:33【问题描述】:我读到here当您需要指定显式生命周期时,共享引用类型被写入&type... 查看详情

python里面元组是啥意思?

...备的。列表的定义列表的创建向列表中添加元素删除列表中的元素获取列表中的元素列表的常用操作符列表的其他方法元组创建和访问一个元组更新和删除一个元组元组相关的操作符内置方法解压元组列表简单数据类型整型浮点... 查看详情

sql语句中的declare是啥意思,具体怎么用啊

...bernumber(10);v_charvarchar2(20);这个一般是用在函数和存储过程中的,sql中不会用到追问恩恩,就是存储过程的 查看详情

Java 枚举类型中受保护的变量是啥意思? [复制]

】Java枚举类型中受保护的变量是啥意思?[复制]【英文标题】:Javawhatdoesaprotectedvariablemeaninenumtype?[duplicate]Java枚举类型中受保护的变量是什么意思?[复制]【发布时间】:2018-08-2620:44:03【问题描述】:在Java9中,我可以编写如下... 查看详情

rust—数据类型

...它与f32速度几乎一样,不过精度更高。布尔类型(bool):Rust中的布尔类型有两个可能的值:true和false字符类型(char):Rust总字符类型(Char)占用四个字节,代表了一个Unicode标量值,在Rust中,拼音字母(Accentedletters),中文、日文、... 查看详情

char 类型变量的默认值是啥意思,它等同于啥字符?

】char类型变量的默认值是啥意思,它等同于啥字符?【英文标题】:Whatdoesthedefaultvalueofachartypevariablemeanandwhatcharacterdoesitequateto?char类型变量的默认值是什么意思,它等同于什么字符?【发布时间】:2022-01-2213:42:08【问题描述】... 查看详情

split()[1]中的[1]是啥意思

...割形成一个字符串数组,然后再通过索引[1]取出所得数组中的第二个元素的值。思路解析:split()方法是将指定字符串按某指定的分隔符进行拆分,拆分将会形成一个字符串的数组并返回。数组中的每元素都各自对应一个索引值... 查看详情