当前位置:网站首页>Rust language -- iterators and closures
Rust language -- iterators and closures
2022-07-06 02:44:00 【A pig】
Closure
Anonymous functions that can capture their environment , Closure is a function , The definition of this function can be assigned to a variable
Example — Program for generating custom exercise plan
The goal is : Don't let users wait unnecessarily
fn main(){
// Create closures
let expensive_closure = |num1, num2|{
num1+num2
};
let b = expensive_closure(11, 12);// Call closure
println!("{}", b);//23
}
Closures do not require annotation of the types of parameters and return values , It can be inferred by itself , Of course, you can also manually mark
fn main(){
let expensive_closure = |num1, num2|{
num1+num2
};
let b = expensive_closure(11, 12);// The first call has determined the parameters and return value types of the closure , And it can't be changed
let c = expensive_closure(11.0, 12.0);// Report errors , Because it has been inferred i32, i32
}
To avoid executing a time-consuming function many times, we can use closures and cooperate struct,struct Hold the closure and its call result
struct Cacher<T>
where T:Fn(u32)->u32
{
calculation:T,
value:Option<u32>,
}
impl<T> Cacher<T>
where T:Fn(u32)->u32{//Fn(u32)->u32 Is a closure type
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
},
}
}
}
Closures can capture variables in the same environment as closures , Function can't
move Keyword can force a closure to take ownership of the environment value it uses
fn main(){
let a = 2;
let test1 = |number|{number};
let b = test1(a);// Successfully captured environment variables a
println!("{}", a);// here a The ownership of is not taken away by closures
}
fn main(){
let x = vec![1, 2, 3];
let equal_to_x = move |z| z==x;
println!("{:#?}", x);//move Take ownership of environment variables
let y = vec![1, 2, 3];
assert!(equal_to_x(y))
}
iterator
Traverse each element : .iter()
iterator trait Only one method is required :next
next: Go down one item at a time
One item of the iterator is returned each time
The returned results are wrapped in Some in
End of the iteration , return None
You can call directly on the iterator next Method
fn main(){
let vec = vec![1, 2, 3];
let mut v1_iter = vec.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);
}
sum() function
fn main(){
let vec = vec![1, 2, 3];
let v1_iter = vec.iter();
let total:i32 = v1_iter.sum();
println!("sum = {}", total);//6
}
map() Method to change an iterator into another iterator
fn main(){
let vec = vec![1, 2, 3];
let v1_iter = vec.iter();
let iter_map:Vec<_> = v1_iter.map(|x|x+1).collect();
println!("{:#?}", iter_map);//2, 3, 4
}
filter Method :
Receive a closure , This closure traverses each element of the iterator , return bool type
If the closure returns true: The current element will be contained in filter In the generated iterator , if false Will not be included in filter In the generated iterator
边栏推荐
- [Yunju entrepreneurial foundation notes] Chapter II entrepreneur test 19
- There are so many giants, why should we independently develop POS store cashier system?
- [Yunju entrepreneurial foundation notes] Chapter II entrepreneur test 12
- How to check the lock information in gbase 8C database?
- Thinking on Architecture Design (under continuous updating)
- Blue Bridge Cup group B provincial preliminaries first question 2013 (Gauss Diary)
- Crawler (9) - scrape framework (1) | scrape asynchronous web crawler framework
- CobaltStrike-4.4-K8修改版安装使用教程
- QT release exe software and modify exe application icon
- Gifcam v7.0 minimalist GIF animation recording tool Chinese single file version
猜你喜欢
微服务间通信
Which ecology is better, such as Mi family, graffiti, hilink, zhiting, etc? Analysis of five mainstream smart brands
如何精准识别主数据?
2022 eye health exhibition, vision rehabilitation exhibition, optometry equipment exhibition, eye care products exhibition, eye mask Exhibition
淘宝焦点图布局实战
CobaltStrike-4.4-K8修改版安装使用教程
GifCam v7.0 极简GIF动画录制工具中文单文件版
"Hands on learning in depth" Chapter 2 - preparatory knowledge_ 2.5 automatic differentiation_ Learning thinking and exercise answers
主数据管理理论与实践
High number_ Vector algebra_ Unit vector_ Angle between vector and coordinate axis
随机推荐
CobaltStrike-4.4-K8修改版安装使用教程
PMP practice once a day | don't get lost in the exam -7.5
07 singleton mode
[postgraduate entrance examination English] prepare for 2023, learn list5 words
RobotFramework入门(一)简要介绍及使用
Shell脚本更新存储过程到数据库
在GBase 8c数据库中使用自带工具检查健康状态时,需要注意什么?
故障分析 | MySQL 耗尽主机内存一例分析
[untitled] a query SQL execution process in the database
微软语音合成助手 v1.3 文本转语音工具,真实语音AI生成器
Advanced technology management - what is the physical, mental and mental strength of managers
Building the prototype of library functions -- refer to the manual of wildfire
Dachang image library
有没有sqlcdc监控多张表 再关联后 sink到另外一张表的案例啊?全部在 mysql中操作
2020.02.11
Misc (eternal night), the preliminary competition of the innovation practice competition of the National College Students' information security competition
C language - Blue Bridge Cup - promised score
2345文件粉碎,文件强力删除工具无捆绑纯净提取版
2.13 simulation summary
Introduction to robotframework (II) app startup of appui automation