首页 > 其他分享 >rust学习_闭包

rust学习_闭包

时间:2024-09-24 16:22:23浏览次数:3  
标签:闭包 变量 move 学习 参数 泛型 let rust

闭包定义 声明 使用1.闭包是什么
    1.闭包允许在其定义的作用域之外访问变量 
2.闭包如何声明
    let a = | 传递给闭包的参数 | -> 闭包返回的类型 {
        闭包的实现
    }
3.如何调用闭包
   像调用函数一样被调用 let result = 函数名(参数1,参数2)
4.闭包可以使用闭包外的环境变量
    let x = 5;
    let square = |num| num * x
    println !("{}",square(3))  //输出15
5.获取所有权:获取到外部变量的使用权后,闭包可以访问该变量,外部不能访问
  let s = String::from("hello")
  let print_s = move || println !("{}",s )  //move:获取变量的所有权 而不是借用它们
  print_s()
  //prilntln !("{}",s ) //这行代码会报错,因为s的所有权已经转到了闭包
 
闭包作为参数6.闭包如何作为参数
  1.定义了函数,它可以接收一个泛型参数,这个泛型参数可以是任何类型
  2.但不能使用这个参数,因为它还不是一个具体类型
  3.需要给泛型 取一个名字 比如F
  4.rust编译器不知道F是什么类型,它需要一些帮助来解释F是什么 这就是泛型约束
 
 fn call_fn<F>(f: F) where F: Fn() {  //<F>:泛型参数的声明    where F:Fn()   F必须实现Fn() trait
    f();F
}
 
闭包和错误处理
7.闭包和错误处理
  1.错误处理 
     fn divide(a: i32, b: i32) -> Result<i32, String> {
         if b == 0 {
            return Err("Divisionby zero".to_string());
         }
        Ok(a / b)
     }
  2.闭包的错误处理
       .filter(|x| x % 2 === 0 )
       .collect::<Result<Vec<_>,String>>()?
  解释
      .collect::<Result<Vec<_>,String>>()
      .collect:Vec类型的一个方法,将迭代器中的元素收集到一个向量中
      ::作用域解析运算符 访问结构体 枚举 模块 和关联函数的成员
     <>  指定泛型参数的类型约束
     Result<>  result类型,包含两个参数
     Vec:可变动态数组
     <_>: 定义泛型类型的参数 
     _:类型参数占位符
闭包和多线程8.闭包和多线程
    1.在不同线程中使用共享数据和执行任务
    如何在多线程中使用闭包
       1.使用move关键字
            fn main(){
                let s = String::from("hello")
                let handle = thread::spawn(move || {
                    println!("{}",s);
                })
                handle.join().unwrap();
            }
闭包和生命周期 生命周期:生命周期用于确保引用始终有效
1.借用环境中的变量 
   let x = 5;
   let print_x = || println!("x: {}",x);
   print_x();
2.可变借用环境中的变量
   let mut y = 10;
   let mut add_to_y = || y+=1
   add_to_y();
   println!("y:{}",y);
3.所有权转移
  let z = String::from("hello")
  let move_z = move || println!("z:{}",z);
  move_z();
闭包的类型1.Fn:表示闭包可以多次被调用 每次调用都会借用环境中的变量
2.FnMut:闭包可以多次被调用 但每次可变地借用环境中地变量
3.FnOnce:闭包只能被调用一次  因为调用时会消耗环境中的变量。这些变量的所有权会被移动到闭包中,因此在闭包外部不能再使用这些变量

标签:闭包,变量,move,学习,参数,泛型,let,rust
From: https://blog.csdn.net/a759329151/article/details/142449800

相关文章

  • Python学习: with open()、os.open()、open()的详细使用
    1.读写文件背景读写文件是最常见的IO操作。Python内置了读写文件的函数,用法和C是兼容的。在磁盘上读写文件的功能都是由操作系统提供的,现代操作系统不允许普通的程序直接操作磁盘。读写文件就是请求操作系统打开一个文件对象(通常称为文件描述符),然后,通过操作系统提供的接口从这个文......
  • 一、机器学习算法与实践_04信息论与决策树算法笔记
    1信息论基础知识介绍信息论是运用概率论与数理统计的方法,去研究信息、信息熵、通信系统、数据传输、密码学、数据压缩等问题的应用数学学科,熵(Entropy)是信息论中的一个重要概念,由克劳德·香农(ClaudeShannon)提出,用于衡量信息的不确定性或系统的混乱程度在机器学习中,熵的概念......
  • 【智能流体力学 1/3理论课程2/3实操课程】深度学习技术在流体力学中的应用与实操培训
    智能流体力学及其仿真技术应用实战前沿背景在当今科学技术快速发展的背景下,流体力学和计算流体力学(CFD)正经历着深刻的变革。传统的流体仿真技术已无法满足日益复杂和高精度的工程需求,而深度学习和人工智能技术的飞速进步,为流体力学的研究和应用提供了新的解决方案。以下是......
  • 日新月异 PyTorch - pytorch 基础: 通过卷积神经网络(Convolutional Neural Networks,
    源码https://github.com/webabcd/PytorchDemo作者webabcd日新月异PyTorch-pytorch基础:通过卷积神经网络(ConvolutionalNeuralNetworks,CNN)做图片分类-通过ResNet50做图片分类的学习(对cifar10数据集做训练和测试),保存训练后的模型,加载训练后的模型并评估指定的......
  • Rust Empty Type
    RustEmptyType(JinQing’sColumn,Sep.,2024)CratevoiddefinesanemptytypeenumVoid{}.Emptytypeisanenumwithnovariants.Emptytypecannotbeinstantiated.See:https://doc.rust-lang.org/nomicon/exotic-sizes.htmlVoidisusedinstaticallyimpo......
  • Rust Pin
    RustPin(JinQing’sColumn,Sep.,2024)From:https://doc.rust-lang.org/std/pin/index.htmlRustcanpindatalocationinmemory,thatmeansitsaddresscannotbechanged.Pinneddataguaranteesthememorylocationisalwaysvalid.Safecodecannotmovepin......
  • 从零到AI专家&产品经理:一站式学习,掌握未来职场核心竞争力
    前言随着人工智能技术的飞速发展,AI已经成为推动社会进步的重要力量。在这个数字化转型的时代,AI产品经理的需求日益增长,成为职场中的香饽饽。一、当前AI产品经理的行情分析行业需求近年来,随着AI技术的普及,各行各业都在积极探索AI的应用场景。无论是互联网巨头还是初创企业,都在加大......
  • 数据挖掘与机器学习(DM&ML)(PART2)
    二.DataMiningProcessModel&DataPreprocessing1.ProcessModel2.Data3.Problemsofdataquality4.Dataunderstanding(Summarystatistics;Visualization)5.Datapreparation(Datacleaning;Datatransformation)P.S.CRossIndustryStandardProcess-Dat......
  • DDD学习与感悟——向屎山冲锋
    软件系统是通过软件开发来解决某一个业务领域或问题单元而产生的一个交付物。而通过软件设计可以帮助我们开发出更加健壮的软件系统。因此,软件设计是从业务领域到软件开发之间的桥梁。而DDD是软件设计中的其中一种思想,旨在提供一种大型复杂软件的设计思路和规范。通过DDD思想可......
  • 9.24 人工智能学习内容
    一.走进思维导图1.思维导图工具(1)在线工具——MindMeister、Coggle、Lucidchart(2)桌面软件——Xmind、FreeMind、MindManager(3)手机应用——SimpleMind、MindNode、iThoughts(4)其他工具——PowerPoint、Google*实践作业:通过思维导图介绍课程(包含中心主题、子主题、连接关系、视......