1个不稳定版本
0.1.0 | 2020年5月26日 |
---|
#2060 在 Rust模式
8KB
yolo-block
yolo-block是一个提供yolo!
块的Rust库,这些块类似于try
块,但会自动展开结果。实际上,在yolo!
块内部,?
操作符的作用相当于unwrap()
。
#![feature(try_blocks)]
use yolo_block::yolo;
use std::convert::TryFrom;
let result = yolo! {
"1".parse::<usize>()?
+ usize::try_from(2i32)?
+ [0,1,2,3].binary_search(&3)?
};
assert_eq!(result, 6);
// Panics with the message "YOLO'd an error: ParseIntError { kind: InvalidDigit }"
let result = yolo! {
"1".parse::<usize>()?
+ "foo".parse::<usize>()?
+ "3".parse::<usize>()?
};
动机
这个crate最初是作为玩笑编写的,但我可以想象它有实际用途。在原型设计时,你可能希望编写最终将使用?
操作符处理错误的代码,但你可能还没有设计好捕获错误的方式。在这种情况下,将代码包裹在yolo!
块中可以让你编写正确使用?
的代码,而不是留下需要后来替换的unwrap()
调用。
设计和功能
yolo!
宏内部使用try
块。由于try
块是不稳定特性(截至本文写作时为Rust 1.43.1),因此此crate仅适用于nightly,并且你必须在你使用的crate中启用#![feature(try_blocks)]
。
yolo-block
与#![no_std]
(以及#![no_implicit_prelude]
)完全兼容。
单个yolo!
块可以处理多种错误类型。这些错误类型可以是任何实现了Debug的类型。不需要额外的类型注解。
内部,我们使用一个可以转换为任何实现了Debug类型的自定义错误类型。为了处理不同类型而不需要构造Box<dyn Debug>
,From
转换只是立即panic。实际上,自定义错误类型是未居住的。
许可证
根据以下之一许可
- Apache许可证,版本2.0(LICENSE-APACHE 或 https://apache.ac.cn/licenses/LICENSE-2.0)
- MIT许可证(LICENSE-MIT 或 http://opensource.org/licenses/MIT)
由您选择。
贡献
除非您明确表示否则,您根据Apache-2.0许可证定义的任何有意提交以包含在作品中的贡献,将如上双许可,不附加任何额外条款或条件。