2个版本
使用旧的Rust 2015
0.1.1 | 2016年7月30日 |
---|---|
0.1.0 | 2016年5月1日 |
5 在 #where 中排名
每月 35 次下载
在 10 个 包(7 个直接)中使用
52KB
898 行
此包提供了RFC #1583中提议的parse_generics!
和parse_where!
宏的稳定、部分实现。这些宏有两个作用
- 它们允许包作者在RFC是否被接受的情况下有限度地使用这些宏。
- 它们向Rust核心团队展示了对此功能的需求。
- 如果RFC被接受,它们提供了从部分实现到完整实现的迁移路径。
由于这些宏是通过macro_rules!
实现的,因此它们有以下限制
- 一般来说,只接受生命周期
'a
到'z
。 - 仅支持完整输出格式的一个子集。
- 它们的效率显著较低,并且消耗了相当数量的递归限制。
目录
parse_generics_shim!
macro_rules! parse_generics_shim {
(
{ $($fields:ident),+ },
then $callback_name:ident ! ( $($callback_args:tt)* ),
$($code:tt)*
) => { ... };
}
解析从$($code:tt)*
开始(如果有)的泛型参数列表,扩展到解析信息加上参数列表之后的未消费标记。扩展的一般形式是
$callback_name! {
$($callback_args)*
{
$(
$fields: [ .. ],
)+
},
$($tail)*
}
回调
$callback_name
和 $callback_args
指定用于解析结果的宏调用。请注意,$callback_args
可包含在 任何 以下之一中:( .. )
、[ .. ]
或 { .. }
。
字段
$fields
指示您想在展开中包含哪些信息。可用的字段有
constr
- 通配参数及其约束的逗号分隔列表。params
- 逗号分隔的通配参数名称列表(包括生命周期和类型)。ltimes
- 逗号分隔的通配生命周期名称列表。tnames
- 逗号分隔的通配类型名称列表。
模拟器 仅 支持以下组合
{constr,params,ltimes,tnames}
{constr}
{ .. }
字段将按照在输入中出现的顺序出现在输出中。一个特殊情况是 { .. }
,它会导致 所有 字段被输出,然后跟随一个字面量 ..
标记。
警告:字段列表在长时间内保持不变没有任何明确保证。因此,强烈建议您不要直接匹配字段后面的 ..
标记。相反,您应该使用以下结构
macro_rules! match_output {
(
{
// Match the fields you care about.
constr: $constr:tt,
params: [ $($params:tt,)* ],
// Ignore the rest; *never* explicitly match `..`!
$($_fields:tt)*
},
$($tail:tt)*
) => { ... };
}
代码
$code
是要解析的实际源代码。如果它以 <
开头,宏将解析通配参数列表。如果它 不是 以 <
开头,宏将按输入以空通配参数列表开始的方式执行(即 <>
)。
示例
以下展示了各种调用形式如何影响输出
parse_generics_shim! {
{ constr, params, ltimes, tnames },
then stringify!(output:),
<'a, T, U: 'a + Copy> X
}
// Expands to:
stringify!(