2022-10-29:go语言中的defer能非常方便地处理资源释放问题,rust语言里如何实现defer功能呢?
Posted 福大大架构师每日一题
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了2022-10-29:go语言中的defer能非常方便地处理资源释放问题,rust语言里如何实现defer功能呢?相关的知识,希望对你有一定的参考价值。
2022-10-29:go语言中的defer能非常方便地处理资源释放问题,rust语言里如何实现defer功能呢?
答案2022-10-29:
rust里有时候你也必须用defer,别说是设计上的问题,因为这种情况你肯定会遇到。
有些时候第三方的结构体,析构函数是不满足需求的,但你也不可能直接修改源码。
第三方的结构体是无法直接实现Drop的,因此只能另外定义结构体来包裹第三方的结构体,然后实现drop,这样就能实现defer功能。这是装饰器模式。
现在已经有现成的轮子,直接用就行。轮子有scopeguard和xjbutil。
scopeguard案例代码如下:
extern crate scopeguard;
struct AA
a: i32,
b: i32,
fn main()
println!("scopeguard");
let mut a = AA a: 1, b: 2 ;
println!("外部1----:p", &(a));
println!("外部1----:p", &(a.a));
println!("外部1----", a.a);
let mut a = scopeguard::guard(&mut a, |a|
a.a = 13;
println!("内部1----:p", &a);
println!("内部1----:p", &a.a);
println!("内部1----", a.a);
);
//let mut a = a;
let mut a = scopeguard::guard(&mut a, |a|
a.a = 14;
println!("内部2----:p", &a);
println!("内部2----:p", &a.a);
println!("内部2----", a.a);
);
//let mut a = a;
a.a = 2;
println!("外部2----:p", &a);
println!("外部2----:p", &a.a);
println!("外部2----", a.a);
let mut a = scopeguard::guard(&mut a, |a|
a.a = 15;
println!("内部3----:p", &a);
println!("内部3----:p", &a.a);
println!("内部3----", a.a);
);
//let mut a = a;
println!("外部3----:p", &(a));
println!("外部3----:p", &(a.a));
println!("外部3----", a.a);
xjbutil案例代码如下:
use xjbutil::defer;
struct AA
a: i32,
b: i32,
fn main()
println!("xjbutil");
let mut a = AA a: 1, b: 2 ;
println!("外部0----:p", &(a));
println!("外部0----:p", &(a.a));
println!("外部0----", a.a);
let a = &mut a;
println!("外部1----:p", &(a));
println!("外部1----:p", &(a.a));
println!("外部1----", a.a);
defer!(
|mut aa|
aa.a = 13;
println!("内部1----:p", &aa);
println!("内部1----:p", &aa.a);
println!("内部1----", aa.a);
,
a
);
defer!(
|mut a|
a.a = 14;
println!("内部2----:p", &a);
println!("内部2----:p", &a.a);
println!("内部2----", a.a);
,
a
);
a.a = 2;
println!("外部2----:p", &a);
println!("外部2----:p", &a.a);
println!("外部2----", a.a);
defer!(
|mut a|
a.a = 15;
println!("内部3----:p", &a);
println!("内部3----:p", &a.a);
println!("内部3----", a.a);
,
a
);
println!("外部3----:p", &(a));
println!("外部3----:p", &(a.a));
println!("外部3----", a.a);
结果如下:
以上是关于2022-10-29:go语言中的defer能非常方便地处理资源释放问题,rust语言里如何实现defer功能呢?的主要内容,如果未能解决你的问题,请参考以下文章