7 个版本 (4 个重大更改)
0.5.1 | 2021年4月11日 |
---|---|
0.5.0 | 2021年4月11日 |
0.4.0 | 2020年8月3日 |
0.3.0 | 2020年5月27日 |
0.1.1 | 2020年5月19日 |
#5 in #早期
每月 37 次下载
在 switchable 中使用
66KB
533 行
tear
类型化早期返回和循环控制 + 类似 try! 的错误处理语法糖
与 Rust v1.34+ 兼容(2019年4月11日发布)
概要
将宏导入您的模块
use tear::prelude::*;
使用 terror!
的显式错误处理语法
let handled = terror! { can_error() => print_error };
let variant = terror! { can_io_error() => CustomError::Io };
// Equivalent using `?`:
let handled = can_error().map_err(print_error)?;
let variant = can_io_error.map_err(CustomError::Io)?;
使用 twist!
早期循环继续
for re in regexes_strings {
// Skip iteration if the regex fails to compile
let re = twist! { Regex::new(re) => |_| next!() }
// Use regex...
使用 tear_if!
关键字样式的早期返回
fn divide_i32 (num: i32, denom: i32) -> Option<f32> {
// Return early if dividing by 0
tear_if! { denom == 0, None };
// Compute quotient...
使用 tear!
类型化早期返回
// Tells the calling function to return early on failure
fn get_value_or_return() -> ValRet<String, i32> { Ret(-1) }
fn status_code() -> i32 {
let v = tear! { get_value_or_return() };
// Process value...
有关更多信息,请参阅文档。
变更日志
请参阅变更日志。
原因
我想使早期返回更明确。
通常,您需要读取到 if
体末尾才能知道是否返回。 tear_if
将该信息放置在块的开始处。
我想有类型化的早期返回,因为这对于向上传递退出码很有用。
类型化的早期返回允许您有可以强制其调用者早期返回的函数。这是受 Raku 中的 Slips 启发的远程操作。
我想有注释的失败点,而不是太多的组合器。
操作符 ?
实际上是一个条件早期返回。要将错误转换为正确的类型,您需要使用组合器。我发现很难辨别这些组合器是用于错误处理的。
类似于这样的
let path = find_config_file().ok_or(Error::FindPathF)?
let mut file = get_file_buffer(&path).map_err(Error::GetFileF)?;
terror!
宏使错误处理更明确
let path = terror! { find_config_file() => Error::FindPathF };
let mut file = terror! { get_file_buffer(&path) => Error::GetFileF };
循环控制和早期返回类似
我已经实现了类型化的早期返回,为什么不实现类型化的循环控制呢?它们同样有用。
另请参阅
- Rust 中的错误处理 § 真实的
try!
宏 /?
操作符 - guard,一个实现 "guard" 表达式的 crate,是
tear_if!
的对应物
许可
根据您的选择,许可协议可以是Apache License, Version 2.0或MIT许可证。
除非您明确表示,否则您根据Apache-2.0许可证定义的,有意提交以包含在本软件包中的任何贡献,将按照上述方式双许可,没有任何附加条款或条件。