#proc-macro #postfix #stable #today #postfix-macros

postfix-macros-impl

postfix-macros 的过程宏 crate

1 个不稳定版本

0.1.0 2020年11月7日

#13#今天

Download history 9/week @ 2024-03-14 44/week @ 2024-03-21 51/week @ 2024-03-28 70/week @ 2024-04-04 102/week @ 2024-04-11 32/week @ 2024-04-18 44/week @ 2024-04-25 9/week @ 2024-05-02 61/week @ 2024-05-09 24/week @ 2024-05-16 17/week @ 2024-05-23 26/week @ 2024-05-30 27/week @ 2024-06-06 27/week @ 2024-06-13 50/week @ 2024-06-20 11/week @ 2024-06-27

117 每月下载量
2 个 crate 中使用 (通过 postfix-macros)

MIT/Apache

16KB
289

postfix-macros

docs crates.io

今天在稳定 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!();
}

无运行时依赖