当前位置:网站首页>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
边栏推荐
- RobotFramework入门(一)简要介绍及使用
- Which ecology is better, such as Mi family, graffiti, hilink, zhiting, etc? Analysis of five mainstream smart brands
- 在GBase 8c数据库中使用自带工具检查健康状态时,需要注意什么?
- 不赚钱的科大讯飞,投资价值该怎么看?
- [matlab] access of variables and files
- 事故指标统计
- There are so many giants, why should we independently develop POS store cashier system?
- [Chongqing Guangdong education] higher mathematics I reference materials of Southwest Petroleum University
- Bigder: I felt good about the 34/100 interview, but I didn't receive the admission
- [Yunju entrepreneurial foundation notes] Chapter II entrepreneur test 11
猜你喜欢
Microsoft speech synthesis assistant v1.3 text to speech tool, real speech AI generator
微服务注册与发现
[postgraduate entrance examination English] prepare for 2023, learn list5 words
[Yunju entrepreneurial foundation notes] Chapter II entrepreneur test 19
Reset nodejs of the system
纯Qt版中国象棋:实现双人对战、人机对战及网络对战
RobotFramework入门(二)appUI自动化之app启动
Microservice registration and discovery
Zero basic self-study STM32 wildfire review of GPIO use absolute address to operate GPIO
C language - Blue Bridge Cup - promised score
随机推荐
Building the prototype of library functions -- refer to the manual of wildfire
解决:AttributeError: ‘str‘ object has no attribute ‘decode‘
Universal crud interface
[Yunju entrepreneurial foundation notes] Chapter II entrepreneur test 16
[Yunju entrepreneurial foundation notes] Chapter II entrepreneur test 20
我把驱动换成了5.1.35,但是还是一样的错误,我现在是能连成功,但是我每做一次sql操作都会报这个
Elimination games
[untitled] a query SQL execution process in the database
MySQL winter vacation self-study 2022 11 (9)
inherited constructors
There are so many giants, why should we independently develop POS store cashier system?
[Yunju entrepreneurial foundation notes] Chapter II entrepreneur test 22
大厂镜像库
Redis delete policy
How to accurately identify master data?
淘宝焦点图布局实战
[Digital IC manual tearing code] Verilog asynchronous reset synchronous release | topic | principle | design | simulation
Is there a case where sqlcdc monitors multiple tables and then associates them to sink to another table? All operations in MySQL
Differences and usage scenarios between TCP and UDP
Solve 9 with C language × 9 Sudoku (personal test available) (thinking analysis)