1 个不稳定版本
0.1.0 | 2020年11月7日 |
---|
#13 在 #今天
117 每月下载量
在 2 个 crate 中使用 (通过 postfix-macros)
16KB
289 行
postfix-macros
今天在稳定 Rust 上的后缀宏
postfix_macros! {
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 行才能在 postfix-macros
上下文中用一行写出的内容
let v = if let Some(v) = something {
v
} else {
continue
};
现在只需一行即可
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
。
许可证
本工具在MIT许可证和Apache许可证(版本2.0)的条款下分发,您可自行选择。
有关详细信息,请参阅LICENSE。
您贡献的许可证
除非您明确表示,否则,根据Apache-2.0许可证定义,您有意提交以包含在作品中的任何贡献,将根据上述条款双授权,无需任何附加条款或条件。
lib.rs
:
今天在稳定 Rust 上的后缀宏
这是包含postfix_macros!
宏的proc宏实现的crate。
postfix-macros
crate重新导出此crate定义的宏,并添加了一些在后缀宏上下文中有用的宏。如果您不需要这些额外的宏,可以使用此crate代替并节省额外的依赖项。
postfix_macros! {
"hello".assert_ne!("world");
val.iter()
.map(|v| v.1)
.find(|z| z.matches!(Custom::Enum(_) | Custom::EnumOther))
.dbg!();
}