• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

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

武飞扬头像
福大大架构师每日一题
帮助1

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);
}

学新通

结果如下:
学新通
学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfbffb
系列文章
更多 icon
同类精品
更多 icon
继续加载