#unwrap #proc-macro #macro

nightly auto_unwrap

一个小型过程宏,将 ? 实例替换为 .unwrap()

2个稳定版本

使用旧的Rust 2015

1.1.0 2022年12月4日
1.0.2 2022年12月4日

#1147 in 过程宏

MIT许可证

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