写点什么

2022-10-29:go 语言中的 defer 能非常方便地处理资源释放问题,rust 语言里如何实现 defer 功能呢?

  • 2022-10-29
    北京
  • 本文字数:1436 字

    阅读完需:约 5 分钟

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);}
复制代码


结果如下:




发布于: 刚刚阅读数: 3
用户头像

还未添加个人签名 2021-02-15 加入

还未添加个人简介

评论

发布
暂无评论
2022-10-29:go语言中的defer能非常方便地处理资源释放问题,rust语言里如何实现defer功能呢?_rust_福大大架构师每日一题_InfoQ写作社区