1个不稳定版本
0.1.0 | 2020年11月7日 |
---|
#564 在 进程宏
每月115次下载
用于 macro-map
13KB
67 行
postfix-macros
稳定的Rust中的后缀宏,今天。
arr.get(10).unwrap_or!(return Err(()));
"hello world".println!();
42.assert_ne!(4 + 2);
val.iter()
.map(|v| v.1)
.find(|z| z.matches!(Custom::Enum(_) | Custom::EnumOther))
.dbg!();
警告:alpha质量软件。存在优先级错误。请在使用时手动验证是否受到影响。
说明
RFC 2442 提出将后缀宏添加到Rust语言。然而,来自语言团队成员的一些基本问题仍然存在,并且看起来它们不会很快得到解决,因此不太可能很快合并,如果确实会合并的话。
该 postfix-macros
crate 为您提供了一个进程宏 postfix_macros
,该宏检查 possibly.chained.expression.macro_name!(params)
模式,并将其重写为传统宏调用的术语,将表达式添加到传递的参数之前。这使得您拥有的每个“感叹号”宏都成为潜在的后缀宏(UFCS 风格)。而且还不够,此crate还提供了一组用于后缀上下文的宏,以便您更加方便。
例如,unwrap_or!
宏使得之前需要5行才能写成的代码
let v = if let Some(v) = something {
v
} else {
continue
};
在 postfix-macros
上下文中可以一行写出
let v = something.unwrap_or!(continue);
此外,它还用更接近 unwrap_or
函数的清洁度替换了 unwrap_or_else
闭包模式,同时仍然像 unwrap_or_else
一样懒惰地评估
let v = something.unwrap_or_else(|| some_expensive_fn_call(1, 2, 3));
let v = something.unwrap_or!(some_expensive_fn_call(1, 2, 3));
足迹
此crate没有依赖除进程宏依赖之外的东西,进程宏依赖本身也没有依赖。不依赖于编译速度极慢的 syn crate。因此编译时间非常短,因此此crate的足迹很小。
此选择也有一些缺点,因为 syn 实际上是一个非常强大的工具,即在某些地方的表达式优先级与正常Rust的优先级不同。这些差异被视为错误,用户欢迎提交有关这些错误的报告。不支持依赖于非Rust特定的行为,这是此crate的semver保证所不支持的。
MSRV
此crate的MSRV是 1.42.0
。
待办事项
- 向rustc发送一个PR,以语法上允许后缀宏,以便我们使用属性宏。参见这个PR了解先例。
许可证
本工具根据MIT许可证和Apache许可证(版本2.0)的条款进行分发,任选其一。
有关详细信息,请参阅LICENSE。
您贡献的许可证
除非您明确表示,否则根据Apache-2.0许可证定义的,您有意提交给作品以包含在内的任何贡献,将以上述方式双许可,不附加任何额外条款或条件。