[Rust]闭包和匿名函数

Rust编程:探索闭包与匿名函数
本文深入探讨Rust中的闭包,重点在于理解lambda函数如何捕获环境。通过实例,我们展示了不同类型的闭包(, , )在捕获环境时的行为,包括不可变引用、可变引用和所有权转移。文中还强调了所有权和生命周期在闭包中的重要性,并通过代码示例说明了错误用法可能导致的编译错误。" 80997496,4898157,使用第三方库BottomSheetLayout实现Android底部滑入效果,"['Android开发', 'UI设计', '第三方组件', '布局动画']

闭包,即匿名且可以捕获环境的函数,是Rust中非常有用的功能。我们在此研究一下lambda function怎么捕获环境。当然啦,如果想把这个问题搞得彻底透彻,我们是需要读Rust compiler或者rust standard library的源代码的。我只是通过尝试,从工程的角度来研究一下这个问题。

首先,每个闭包都有自己独特的type,这点跟C++很类似。但是,我们并不需要获取其类型,因为所有闭包都实现了Fn, FnMut, FnOnce其中的一个。这几个trait的区别在于如何捕获环境:

  1. Fn从环境捕获不可变引用,即&T
  2. FnMut从其环境捕获可变引用,即&mut T
  3. FnOnce从其环境获得变量所有权,即T

让我们来一一实践。

    let s = 33;
    let test = || {
        let t = s + 44;
        t
    };
    let res = test();
    println!("{},{}",res,s);

上面的代码就是典型的通过实现Fn来捕获环境。

   let mut s = String::from("good");
    let mut test = || {
        let t = &mut s;
        t.push_str(" morning");
    };
    test();
    println!("{}",s);

在这个闭包里面,我们获取了s&mut s,因此属于实现了Fn

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值