#try #error #yolo

nightly no-std yolo-block

类似于try块,但会自动展开结果

1个不稳定版本

0.1.0 2020年5月26日

#2060Rust模式

MIT/Apache

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许可证定义的任何有意提交以包含在作品中的贡献,将如上双许可,不附加任何额外条款或条件。

无运行时依赖