- 浏览: 767824 次
- 性别:
- 来自: 深圳
文章分类
- 全部博客 (1045)
- 数据结构 (36)
- UML与设计模式 (42)
- c++ (87)
- rust (36)
- Qt (41)
- boost模板元编程 (43)
- Linux (77)
- 汇编 (4)
- 其它 (2)
- 烹饪 (3)
- unix c / socket (73)
- 软件工程 (4)
- shell (53)
- Python (37)
- c++ primer 5th(c++11) (22)
- 数据库/MySQL (27)
- 数据存储 (4)
- lisp (7)
- git (4)
- Utility (3)
- CDN与DNS (54)
- Http (53)
- php (7)
- nginx/lua/openresty (41)
- redis (11)
- TCP/IP (16)
- 互联网 (6)
- kernel (2)
- go (34)
- 区块链 (43)
- 比特股 (13)
- 以太坊 (23)
- 比特币 (23)
- 密码学 (10)
- EOS (53)
- DAG (1)
- docker (1)
- filecoin (7)
- solidity (65)
- ipfs (8)
- 零知识证明 (1)
- openzeppelin (3)
- java (1)
- defi (7)
- Ton (0)
最新评论
返回闭包
main.rs
lib.rs
fn returns_closure() -> Box<dyn Fn(i32) -> i32> { Box::new(|x| x + 1) }
main.rs
use std::thread; use std::time::Duration; fn simulated_expensive_calculation(intensity: u32) -> u32 { println!("calculating slowly..."); thread::sleep(Duration::from_secs(2)); intensity } struct Cacher<T> where T: Fn(u32) -> u32,//指定它是一个闭包Fn { calculation: T, value: Option<u32>, } impl<T> Cacher<T> where T: Fn(u32) -> u32, { fn new(t: T) -> Cacher<T>{ Cacher{ calculation:t, 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 generate_workout(intensity: u32, random_number: u32) { //let expensive_result = simulated_expensive_calculation(intensity); //闭包,这里的u32不指定也可以推断出来 // let expensive_closure = |num:u32| { // println!("calculating slowly..."); // thread::sleep(Duration::from_secs(2)); // num // }; //将闭包设置到结构体T中 let mut expensive_closure = Cacher::new(|num:u32| { println!("calculating 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 a break today! Remember to stay hydrated!"); } else { println!("Today, run for {} minutes!", expensive_closure.value(intensity)); } } } fn main() { let simulated_user_specified_value = 10; let simulated_random_number = 7; generate_workout(simulated_user_specified_value, simulated_random_number); let example_closure = |x| x; let s = example_closure(String::from("hello")); //闭包只能初始化一次类似,上面初始化为String了,下面则会编译失败 //let n = example_closure(5); // let x = 4; // // fn equal_to_x(z: i32) -> bool { // println!("x:{}",x); //闭包不能使用外部的值 // true // //z == x // } let x = vec![1, 2, 3]; //let equal_to_x = move |z| z == x; let y:Vec<_> = x.iter().map(|x|x+1).collect(); for i in y { print!("{}",i); } println!(); } #[test] fn call_with_different_values() { let mut c = Cacher::new(|a| a); let v1 = c.value(1); //这里值还是1,不会变 let v2 = c.value(2); println!("v2:{}",v2); assert_eq!(v2, 2); } calculating slowly... Today, do 10 pushups! Next, do 10 situps! 234
lib.rs
#[test] fn iterator_demonstration() { let v1 = vec![1, 2, 3]; let mut v1_iter = v1.iter(); assert_eq!(v1_iter.next(), Some(&1)); assert_eq!(v1_iter.next(), Some(&2)); assert_eq!(v1_iter.next(), Some(&3)); assert_eq!(v1_iter.next(), None); } #[test] fn iterator_sum() { let v1 = vec![1, 2, 3]; let v1_iter = v1.iter(); let total: i32 = v1_iter.sum(); assert_eq!(total, 6); } #[derive(PartialEq, Debug)] struct Shoe { size: u32, style: String, } //filter迭代器适配器捕获其环境的闭包 fn shoes_in_size(shoes: Vec<Shoe>, shoe_size: u32) -> Vec<Shoe> { shoes.into_iter().filter(|s| s.size == shoe_size).collect() } #[cfg(test)] mod tests { use super::*; #[test] fn filters_by_size() { let shoes = vec![ Shoe { size: 10, style: String::from("sneaker"), }, Shoe { size: 13, style: String::from("sandal"), }, Shoe { size: 10, style: String::from("boot"), }, ]; let in_my_size = shoes_in_size(shoes, 10); assert_eq!( in_my_size, vec![ Shoe { size: 10, style: String::from("sneaker") }, Shoe { size: 10, style: String::from("boot") }, ] ); } } struct Counter { count: u32, } impl Counter { fn new() -> Counter { Counter { count: 0 } } } impl Iterator for Counter { type Item = u32; fn next(&mut self) -> Option<Self::Item> { if self.count < 5 { self.count += 1; Some(self.count) } else { None } } } #[test] fn calling_next_directly() { let mut counter = Counter::new(); assert_eq!(counter.next(), Some(1)); assert_eq!(counter.next(), Some(2)); assert_eq!(counter.next(), Some(3)); assert_eq!(counter.next(), Some(4)); assert_eq!(counter.next(), Some(5)); assert_eq!(counter.next(), None); } #[test] fn using_other_iterator_trait_methods() { //1*2 //2*3 //3*4 //4*5 let sum1: u32 = Counter::new().zip(Counter::new().skip(1)).map(|(a, b)| a * b).sum(); println!("sum1:{}",sum1); //2*3+3*4+5*None let sum: u32 = Counter::new() .zip(Counter::new().skip(1)) //zip将两个迭代器压缩到一起 .map(|(a, b)| a * b) .filter(|x| x % 3 == 0) .sum(); assert_eq!(18, sum); }
fn test_lambda(){ let add = |a:i32,b:i32| -> i32 {a+b}; println!("{:?}",add(1,2)); } 3
trait Any{ fn any(&self,f:&(Fn(u32) -> bool)) -> bool; } impl Any for Vec<u32> { fn any(&self,f:&(Fn(u32) -> bool)) -> bool { for &x in self.iter() { if f(x) { return true; } } false } } fn test_any(){ let v = vec![1,2,3]; let b = v.any(&|x| x==3); println!("{:?}",b); } v:1 v:0
发表评论
-
模式匹配
2022-03-27 17:35 172fn main() { //if let ... -
rust mutex
2022-03-27 12:14 221use std::sync::{Arc,Mutex}; ... -
rust channel
2022-03-27 11:58 238use std::sync::mpsc; use std ... -
rust智能指针
2022-03-26 12:31 222Box,Rc,RefCell都是不可变借用,只不过RefCel ... -
test框架
2022-03-25 10:18 231#[derive(Debug)] struct Rect ... -
lifeCycle
2022-03-24 14:10 160fn longest<'info>(x: &a ... -
hashmap
2022-03-24 11:11 174use std::collections::HashMap ... -
rust map
2020-08-18 16:02 507fn test_map(){ let a=[1, ... -
rust call
2020-08-13 10:27 346fn call<F>(clousure:F) ... -
rust cell
2020-08-06 11:47 228fn test_cell(){ use std: ... -
rust引用记数
2020-08-06 11:10 324fn test_ref(){ use std:: ... -
rust内存泄漏
2020-08-03 10:20 457原因主要有三种: 1.线程崩溃,析构无法调用 2.使用引用记数 ... -
rust as类型转换
2020-07-24 10:34 587fn testAs(){ let a = 1u3 ... -
rust 线程 spawn
2020-07-24 10:03 304use std::thread; use std::ti ... -
rust println!
2020-07-20 11:09 349fn testPrintln(){ printl ... -
rust trait
2020-07-16 20:27 274使用trait可以让不用的类型实现同一个行为,定义函数的默认实 ... -
rust 范型
2020-07-15 20:00 274fn testOption(){ let i : ... -
rust 优先队列BinaryHeap
2020-07-15 09:22 862Rust提供的优先队列是基于二叉最大堆实现的 fn te ... -
rust set
2020-07-15 09:23 491HashSet<K>和BTreeSet<K& ... -
rust map
2020-07-15 09:23 321BTreeMap是有序的,HashMap是无序的 fn ...
相关推荐
7. Rust闭包:Rust学习笔记Day 23-24讲述了Rust的闭包,包括闭包的定义、闭包的使用场景、闭包的实现等。 8. Rust库和生态系统:Rust学习笔记Day 25讲述了Rust的库和生态系统,包括Rust的标准库、 THIRD-PARTY库和...
### 详解 Rust 的函数与闭包 #### 一、引言 在现代系统级编程语言中,Rust 以其安全性和高效性而闻名。Rust 不仅提供了强大的内存管理功能,还支持函数式编程特性,如函数、闭包、高阶函数等。本文将详细介绍 Rust ...
您可以简单地使用Rust闭包对线程进行编程,并使用async/await对其进行编排。例子wasm-mt-pool wasm-mt基于wasm-mt线程池库。 [| ] 您可以在浏览器中运行以下所有应用! EXEC -如何使用wasm_mt 。 [| ] fib-使用嵌套...
这份中文手册包含了Rust语言的各个方面,包括基础语法、类型系统、内存管理、所有权模型、生命周期、闭包、模块系统、错误处理、泛型、宏、标准库以及系统编程和跨平台编译等内容。 1. **Rust基础语法**:Rust的...
### Rust 编程艺术:迭代器与闭包的精妙运用 #### 一、Rust 语言概述 Rust 是一种高性能的系统级编程语言,它由 Mozilla 研究院发起,Graydon Hoare 设计,并于 2010 年首次发布。Rust 的设计目标在于提供内存安全...
5. **现代语言特性**:Rust提供了模式匹配、闭包、迭代器、错误处理等现代编程语言特性。 6. **跨平台**:Rust支持跨平台开发,可以在多种操作系统上编译和运行。 7. **包管理**:Rust有一个强大的包管理器和构建...
3. **函数和闭包**:讲解Rust中的函数定义、参数传递、返回值以及匿名函数(闭包)。闭包在Rust中扮演着重要角色,可以用于函数式编程风格。 4. **模块系统**:阐述如何组织代码,包括模块、路径、可见性和包...
3. 现代化:Rust是一种现代语言,提供了许多现代化的语言特性,例如泛型、闭包、迭代器等。 Rust的开发工具 1. rustc:Rust的编译器,可以将Rust代码编译成机器代码。 2. rustup:Rust的工具链管理器,可以管理...
4. **函数与闭包**:Rust的函数可以接受闭包作为参数,闭包是一种可以捕获其环境的匿名函数。闭包的使用极大地增强了代码的灵活性和可读性。 5. **宏**:Rust的宏系统允许在编译时进行代码生成,增强了语言的表达...
4. **函数与闭包**:Rust支持函数和匿名函数(闭包)。闭包可以捕获和存储其周围环境的引用,提供了强大的函数式编程特性。 5. **生命周期**:Rust中的生命周期是类型系统的一部分,用来表示引用的存活时间,确保...
- **闭包**:闭包是一种函数,它可以捕获并记住其作用域内的变量。 - **迭代器**:迭代器提供了一种遍历集合元素的方式。 - **泛型**:允许编写能够接受不同类型的通用函数或结构体。 - **生命周期**:生命周期是 ...
- **闭包**:捕获周围环境变量的匿名函数。 - **高阶函数**:接受函数作为参数或者返回函数的函数。 ##### 8. 模块 - **知识点**: - **模块定义**:使用`mod`关键字定义模块。 - **模块组织**:通过模块将代码...
“Capturing”展示了闭包如何捕获其环境中的变量,这对于理解Rust的变量所有权模型非常重要。 Rust的“Iterator”和“Higher Order Functions”部分介绍了迭代器和高阶函数的概念,它们是函数式编程范式中的重要...
Rust的闭包分为三类:`Fn`(只读),`FnMut`(可变),`FnOnce`(只能调用一次)。 11. **泛型(Generics)**: 泛型允许编写可重用的代码,适用于多种类型。 12. **trait(特性)**: 特性定义了类型必须实现的方法...
3. **函数和闭包**:Rust中的函数可以有默认参数、可变参数和返回多个值。闭包(Closures)是匿名函数,可以捕获其所在作用域的变量,这在处理异步操作和迭代时非常有用。 4. **模式匹配**:Rust的模式匹配是其强大...
8. **其他高级特性**:Rust还提供了泛型、错误处理、模式匹配、闭包等高级特性,使得编写高效且安全的代码变得可能。 这本书通过323页的详细内容,逐步引导读者从基础到进阶,全面掌握Rust编程语言。通过实践和理解...
- **闭包**:Rust中的闭包是一种可以捕获外部环境变量的匿名函数。 #### 七、所有权 **所有权概念**: - **所有权机制**:Rust通过所有权模型来管理内存资源,确保资源被安全地分配和回收。 - **借用规则**:了解...
此外,我们还需要熟悉Rust的函数式编程特性,例如闭包和迭代器,这些对于处理大规模数据和算法迭代非常有用。同时,Rust的错误处理机制也非常重要,确保在执行过程中遇到问题时能够优雅地失败并提供有用的错误信息。...
- 高级特性:包括宏、闭包、迭代器等高级主题。 - Rust生态系统:包括如何使用 crates.io 上的包,以及如何编写和发布自己的crates。 - 系统编程:Rust作为系统编程语言的特性,比如直接与操作系统交互的能力。 - ...
闭包在Rust中是第一类公民,可以在任何地方存储和传递。 Rust的类型系统十分强大,支持枚举(enum)和结构体(struct)。枚举可以表示一系列相关的值,而结构体则用于封装相关数据。Rust还提供了模式匹配功能,使得...