2个稳定版本
1.0.1 | 2020年12月30日 |
---|
#1695 in Rust模式
10KB
153 行
PhantomDrop
用于延迟函数执行直到代码块结束的小型库。
使用方法
它与marker
类型相似,适用于将析构函数添加到不希望实现Drop
的结构体中,也适用于延迟函数调用。
额外的析构函数
为了在不实现Drop
的情况下将析构函数添加到结构体中(这可能会引起一些问题,例如失去部分移动的能力),我们可以在结构体中使用PhantomDrop
作为字段。请注意,由于闭包类型是不透明的,在这种情况下字段可能需要指定大小。
延迟执行
类似于Go中的defer
机制,我们可以使用它来延迟函数调用
fn do_something()
{
let _guard = phantomdrop::defer(|| println!("Hello!"));
// do some work
} // "Hello!" will now be printed when the function returns or unwinds (unless unwinds are disabled).
持有数据
守护者还可以持有值
fn do_something(print: String)
{
let _guard = PhantomDrop::new(print, |string| println!("Dropped: {}", string));
// do some work
} // `print` will now be printed here.
捕获
我们可以通过引用、可变引用或移动来捕获值。在守护者内持有值和捕获闭包可以同时使用。
fn do_something(print: String)
{
let _guard = phantomdrop::defer(move || println!("Dropped: {}", print)); // Moves `print` into itself.
// do some work
} // `print` will now be printed here.
fn do_something_by_reference(print: String)
{
let _guard = phantomdrop::defer(|| println!("Dropped: {}", print)); // Holds an immutable reference to `print`.
let trimmed = print.trim(); // Can still be used
} // `print` will now be printed here.
fn do_something_by_mutable_reference(print: &mut String)
{
let _guard = phantomdrop::defer(|| *print = String::from("Dropped")); // Holds a mutable reference to `print`.
} // `print` will now be set to "Dropped" here.
许可证
GPL'd with <3