2个稳定版本
使用旧的Rust 2015
1.1.0 | 2022年12月4日 |
---|---|
1.0.2 |
|
#1147 in 过程宏
10KB
78 行
auto_unwrap
你是否曾经编写过函数,却因为懒惰而没有让它返回 Result<T, E>
,但仍想使用 ?
操作符?我向您介绍
use auto_unwrap::auto_unwrap;
#[auto_unwrap]
fn fn_1() -> i32 {
let s = "does it detect this question mark? (no)";
println!("{}", s);
let x: Result<i32, ()> = Ok(23);
return x?; // gets replaced with x.unwrap();
}
assert_eq!(fn_1(), 23);
您是否希望将 ?
放在某个地方?
use auto_unwrap::auto_unwrap;
#[auto_unwrap]
fn fn_2() {
#[skip_auto_unwrap] // skips until (and including) the next brace-delimited group or semicolon
let closure = || -> Result<u32, f32> {
let ok: Result<u32, f32> = Ok(1);
assert_eq!(ok?, ok.unwrap());
let err: Result<u32, f32> = Err(2.0);
assert_eq!(err?, err.unwrap()); // without the skip this would panic!
Ok(2)
};
assert_eq!(closure(), Err(2.0));
}
这是从之前写的代码中更新的:yauc
我为此创建了一个特定的用例:Bevy系统。在那里,由于必须进行的查询非常多,因此可能需要很多 .unwrap()
,这很烦人。
可能更好的做法是使用 .except()
,但是嘛。而且我主要创建这个是为了学习如何做过程宏。
依赖项
~1.5MB
~35K SLoC