#panic #defer #unwind

no-std scopeguard

一个RAII作用域守护者,当它超出作用域时将执行给定的闭包,即使代码在panic之间(假设正在展开panic)。定义了宏defer!defer_on_unwind!defer_on_success!作为实现了的策略的简写

10个版本 (3个稳定版)

使用旧的Rust 2015

1.2.0 2023年7月17日
1.1.0 2020年2月16日
1.0.0 2018年12月19日
0.3.3 2017年10月13日
0.1.0 2015年4月30日

2 in #panic

Download history 2233771/week @ 2024-04-22 2106395/week @ 2024-04-29 2157258/week @ 2024-05-06 2223400/week @ 2024-05-13 2254892/week @ 2024-05-20 2109384/week @ 2024-05-27 2242570/week @ 2024-06-03 2497341/week @ 2024-06-10 2277006/week @ 2024-06-17 2339839/week @ 2024-06-24 2064389/week @ 2024-07-01 2409264/week @ 2024-07-08 2372527/week @ 2024-07-15 2422537/week @ 2024-07-22 2494534/week @ 2024-07-29 2686210/week @ 2024-08-05

10,120,386 每月下载量
31,326 个crate中使用 (直接使用239个)

MIT/Apache

22KB
263

scopeguard

Rust crate,提供方便的RAII作用域守护者,当它超出作用域时将执行给定的闭包,即使代码在panic之间(假设正在展开panic)。

defer!guardno_std兼容(只需要core),但展开/不展开策略需要链接到std。默认情况下,启用了use_std crate功能。禁用默认功能以支持no_std

请在此处阅读API文档

最低支持的Rust版本:1.20

build_status crates

如何使用

#[macro_use(defer)]
extern crate scopeguard;

use scopeguard::guard;

fn f() {
    defer! {
        println!("Called at return or panic");
    }
    panic!();
}

use std::fs::File;
use std::io::Write;

fn g() {
    let f = File::create("newfile.txt").unwrap();
    let mut file = guard(f, |f| {
        // write file at return or panic
        let _ = f.sync_all();
    });
    // access the file through the scope guard itself
    file.write_all(b"test me\n").unwrap();
}

近期更改

  • 1.2.0

    • 在into_inner中使用ManuallyDrop而不是mem::forget。 (by @willtunnels)
    • 如果守护者没有分配给变量而是立即被丢弃,则发出警告。 (by @sergey-v-galtsev)
  • 1.1.0

    • 更改宏(defer!defer_on_success!defer_on_unwind!)以接受语句。 (by @konsumlamm)
  • 1.0.0

    • 将闭包类型从FnMut(&mut T)更改为FnOnce(T):通过值传递内部值而不是可变引用是一个破坏性变更,但允许守护者闭包消费它。 (by @tormol)

    • 添加defer_on_success!guard_on_success()OnSuccess策略,在作用域退出时没有panic的情况下触发。这是defer_on_unwind! / guard_on_unwind() / OnUnwind的对立面。

    • 添加 ScopeGuard::into_inner(),它“解除”了守卫并返回受保护的值。(由 @tormol 提供)

    • 为具有非 Sync 封闭的守卫实现 Sync

    • 需要 Rust 1.20

  • 0.3.3

    • 通过 @stjepang 在更多函数上使用 #[inline](#14)
    • 为 crate 文档添加示例
  • 0.3.2

    • 添加 crate 类别
  • 0.3.1

    • 添加 defer_on_unwind!Strategy 特性
    • Guard 重命名为 ScopeGuard
    • 添加 ScopeGuard::with_strategy
    • ScopeGuard 现在实现了 Debug
    • 需要 Rust 1.11
  • 0.2.0

    • 需要 Rust 1.6
    • 无条件使用 no_std
    • 没有其他更改
  • 0.1.2

    • 添加宏 defer!

无运行时依赖

功能