首页 > 其他分享 >Rust语言 学习12 闭包和迭代器

Rust语言 学习12 闭包和迭代器

时间:2023-04-18 11:33:08浏览次数:47  
标签:闭包 12 random value intensity u32 println Rust

一、闭包入门

Rust语言 学习12  闭包和迭代器_类型推断

Rust语言 学习12  闭包和迭代器_泛型_02

use std::thread;
use std::time::Duration;

fn main(){
    let specified_value = 10;
    let random_number = 7;
    generate_workout(specified_value,random_number);

}

fn generate_workout(intensity:u32,random_number:u32) {
    // 定义一个函数闭包
    let expensive_closure = |num| {
        println!("calculate slowly");
        thread::sleep(Duration::from_secs(2));
        num;
    };

    // 然后传入函数闭包
    if intensity < 25 {
        println!("Today,do {} pushups!",expensive_calculate(intensity));
        println!("Next do {} situps!", expensive_calculate(intensity));
    } else {
        if random_number == 3 {
            println!("Take break today");
        } else {
            println!("Today,fun for {} minutes",expensive_calculate(intensity));
        }
    }
}

二、闭包的类型推断和标注

Rust语言 学习12  闭包和迭代器_泛型_03

Rust语言 学习12  闭包和迭代器_类型推断_04

Rust语言 学习12  闭包和迭代器_泛型_05

Rust语言 学习12  闭包和迭代器_类型推断_06

已经推断成String类型,就不能再推断成u32类型了

三、使用泛型参数和Fn Trait来存储闭包

Rust语言 学习12  闭包和迭代器_类型推断_07

Rust语言 学习12  闭包和迭代器_泛型_08

Rust语言 学习12  闭包和迭代器_类型推断_09

use std::thread;
use std::time::Duration;

// 结构体存储闭包
struct Cacher<T>
where T: Fn(u32) -> u32,
{
    calculation : T,
    value : Option<u32>,
}

impl <T> Cacher<T>
    where T: Fn(u32) -> u32,
{
    fn new(calculation : T) -> Cacher<T> {
        Cacher {
            calculation,
            value : None,
        }
    }

    fn value(&mut self,arg:u32) -> u32 {
        match self.value {
            Some(v) => v,
            None => {
                let v = (self.calculation)(arg);
                self.value = Some(v);
                v
            }
        }
    }
    
}


fn main(){
    let specified_value = 10;
    let random_number = 7;
    generate_workout(specified_value,random_number);

}

fn generate_workout(intensity:u32,random_number:u32) {
    // 定义一个函数闭包
    let mut expensive_closure = Cacher::new(|num| {
        println!("calculate slowly");
        thread::sleep(Duration::from_secs(2));
        num
    });

    // 然后传入函数闭包
    if intensity < 25 {
        println!("Today,do {} pushups!",expensive_closure.value(intensity));
        println!("Next do {} situps!", expensive_closure.value(intensity));
    } else {
        if random_number == 3 {
            println!("Take break today");
        } else {
            println!("Today,fun for {} minutes",expensive_closure.value(intensity));
        }
    }
}

Rust语言 学习12  闭包和迭代器_泛型_10

Rust语言 学习12  闭包和迭代器_类型推断_11

四、使用闭包捕获上下文

Rust语言 学习12  闭包和迭代器_泛型_12

标签:闭包,12,random,value,intensity,u32,println,Rust
From: https://blog.51cto.com/u_6478076/6202756

相关文章

  • iTOP4412开发板Qt程序打包和部署
    因为我们要把写好的程序发给用户来用,写好的源码也不方便给别人看,所以要把程序进行打包部署。步骤一:点击左下角的电脑图标将Debug模式切换到Release模式。release模式:发布版本,不对源代码进行调试,基本没有调试信息。debug模式:调试版本,有很多调试信息。步骤二:找到release模式......
  • cargo rustc
    RUSTC_BOOTSTRAP=1如果需要在稳定版编译器上执行一些夜间发布功能,可以设置该环境变量。$cargorustc---Zunpretty=expandedCompilingxxxv0.1.0(F:\xxx)error:theoption`Z`isonlyacceptedonthenightlycompiler$RUSTC_BOOTSTRAP=1cargorustc---Zunp......
  • 应用连MySQL 报错ERROR 1129 Host is blocked because of many connection errors
    开发反馈应用连MySQL报错 createconnectionSQLException,url:连接串,errorCode1129。搜索1129报错,报错内容为:Hostisblockedbecauseofmanyconnectionerrors一、报错原因同一个ip在短时间内产生太多中断的数据库连接(超过mysql数据库max_connection_errors设置),导......
  • Lecture#12 Query Processing1
    1QueryPlan通常一个SQL语句会被组织成如图的树状查询计划,数据从叶节点流到根节点,查询结果在根节点中得出。通常,树上的操作符operators是二元的(1~2个子运算符)。而本节将讨论在这样一个计划中,如何为这个数据流动过程建模,大纲如下:ProcessingModelsAccessMethodsEx......
  • UOJ #712. 【北大集训2021】简单数据结构
    题面传送门很好的题目。首先我们假设\(a\)没有初始值,这貌似是平凡的。因为这样的话如果两个位置\(x<y\)那么\(a_x\leqa_y\)对于任意时刻都成立。取\(\min\)的过程只需要线段树上二分加上区间覆盖即可。但是有初始值怎么办呢?这个问题开始变得棘手起来。但是我们发现上......
  • VMWare虚拟机IP变成127.0.0.1怎么办
    输入命令:dhclient-v即可如果还不好使,可以试试下面的方法(Cnetos7)打配置文件vim/etc/sysconfig/network-scripts/ifcfg-ens33打开配置文件找到ONBOOT=no要改为ONBOOT=yes默认是ONBOOT=no,它打意思是:是否随网络服务启动,eth0生效,如果为no,则ifconfig看不到eth0 ......
  • 2-209-(LeetCode-121) 买卖股票的最佳时机
     1.题目 https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/121. 买卖股票的最佳时机 2.解法2.1解法一:动态规划  2.2解法二:非动态规划 if(prices.length<2){return0;}intmin=prices[0];......
  • VC6: LNK 1202 missing debugging info in .pdb file
    "fatalerrorlink1202:Debug\vc60.pdbismissingdebugginginformationforreferencingmodule" 产生原因是:在当前项目中引用了另一个项目的lib库,我将当将项目设置生成PDBtype:Con,但是另一个项目的lib库可能没有对应的pdb,重新编译那个lib库,重引用它再编译当前项目,......
  • python s12 day13 JavaScript、Dom和jQuery
    1.JavaScriptJavaScript是一门编程语言,浏览器内置了JavaScript语言的解释器,所以在浏览器上按照JavaScript语言的规则编写相应代码之,浏览器可以解释并做出相应的处理。1、JavaScript代码存在形式<!--方式一--><scripttype"text/javascript"src="JS文件"></script>......
  • mysql入坑之路(12)windows 部署MySQL,tar方式手动添加服务进行程序管理
    1.“CTRL+R”打开运行窗口,输入regedit点击确定打开注册表编辑器2.找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services3.新建项MYSQL服务4.添加项内参数和值名称类型数据DisplayName编辑字符串值mysql-5.6ErrorControl编辑DWORD(32位)值1Imag......