#guard #panic #scope #raii #destructor #future #async

无 std 范围守卫

简单的 RAII 范围守卫

3 个稳定版本

1.2.0 2023年3月11日
1.1.0 2022年9月9日
1.0.0 2021年3月3日

#221无标准库

Download history 87/week @ 2024-03-13 38/week @ 2024-03-20 43/week @ 2024-03-27 43/week @ 2024-04-03 43/week @ 2024-04-10 44/week @ 2024-04-17 52/week @ 2024-04-24 7/week @ 2024-05-01 25/week @ 2024-05-08 34/week @ 2024-05-15 47/week @ 2024-05-22 87/week @ 2024-05-29 75/week @ 2024-06-05 77/week @ 2024-06-12 24/week @ 2024-06-19 21/week @ 2024-06-26

219 每月下载量

BSL-1.0 许可证

10KB
129

范围守卫

Rust Crates.io Documentation

简单的 RAII 范围守卫

功能

  • std - 启用异步作用域,以便在 future 完成时运行析构函数,即使它崩溃。

lib.rs:

简单的 RAII 范围守卫

使用方法

无参数守卫

use scope_guard::scope_guard;

let mut is_run = false;
{
     scope_guard!(|| {
         is_run = true;
     });
}
assert!(is_run);

单个参数守卫

use scope_guard::scope_guard;

fn do_stuff(val: &mut u32)  {
    let old_val = *val;
    let mut val = scope_guard!(|val| {
        *val = old_val;
    }, val);

    **val += 1; //Double * to deref &mut u32

    let is_ok = false;//doing some computations
    if is_ok {
        val.forget();
    }
}

let mut val = 0;
do_stuff(&mut val);
assert_eq!(val, 0);

let mut guard = scope_guard!(|val| {
    *val = 1;
}, &mut val);
drop(guard);
assert_eq!(val, 1);

堆栈析构函数调用

use scope_guard::scope_guard;

fn do_stuff(val: &mut u32)  {
    let old_value = *val;
    let val = scope_guard!(|val| {
        assert_eq!(*val, old_value);
        //Do nothing
    }, val);

    let mut val = val.stack(|val| {
        **val = old_value;
    });

    **val += 1; //Double * to deref &mut u32
}

let mut val = 0;
do_stuff(&mut val);
assert_eq!(val, 0);

多个参数守卫

use scope_guard::scope_guard;

fn do_stuff(val: &mut u32, is_run: &mut bool)  {
    let old_val = *val;
    let mut guard = scope_guard!(|(val, is_run)| {
        *val = old_val;
        *is_run = false;
    }, val, is_run);

    *guard.0 += 1;
    *guard.1 = true;

    let is_ok = false; //doing some computations
    if is_ok {
        let (_val, _is_run) = guard.into_inner(); //analogues to forget
    }
}

let mut is_run = false;
let mut val = 0;
do_stuff(&mut val, &mut is_run);
assert_eq!(val, 0);
assert!(!is_run);

let mut guard = scope_guard!(|(val, is_run)| {
    *val = 1;
    *is_run = true;
}, &mut val, &mut is_run);

drop(guard);
assert_eq!(val, 1);
assert!(is_run);

无运行时依赖

功能