当前位置:网站首页>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
边栏推荐
- Solve 9 with C language × 9 Sudoku (personal test available) (thinking analysis)
- Atcoder beginer contest 233 (a~d) solution
- 【若依(ruoyi)】ztree 自定义图标(iconSkin 属性)
- Fault analysis | analysis of an example of MySQL running out of host memory
- 微服务间通信
- Referenceerror: primordials is not defined error resolution
- 如何精准识别主数据?
- What should we pay attention to when using the built-in tool to check the health status in gbase 8C database?
- Building the prototype of library functions -- refer to the manual of wildfire
- Microservice registration and discovery
猜你喜欢
[Digital IC manual tearing code] Verilog asynchronous reset synchronous release | topic | principle | design | simulation
不赚钱的科大讯飞,投资价值该怎么看?
[Yunju entrepreneurial foundation notes] Chapter II entrepreneur test 23
2345文件粉碎,文件强力删除工具无捆绑纯净提取版
2345 file shredding, powerful file deletion tool, unbound pure extract version
[Yunju entrepreneurial foundation notes] Chapter II entrepreneur test 19
High number_ Vector algebra_ Unit vector_ Angle between vector and coordinate axis
[Yunju entrepreneurial foundation notes] Chapter II entrepreneur test 15
Master data management theory and Practice
RobotFramework入门(三)WebUI自动化之百度搜索
随机推荐
Bigder: I felt good about the 34/100 interview, but I didn't receive the admission
Microsoft speech synthesis assistant v1.3 text to speech tool, real speech AI generator
【Unity3D】GUI控件
C language - Blue Bridge Cup - promised score
Gifcam v7.0 minimalist GIF animation recording tool Chinese single file version
[Yunju entrepreneurial foundation notes] Chapter II entrepreneur test 12
Building the prototype of library functions -- refer to the manual of wildfire
Which ecology is better, such as Mi family, graffiti, hilink, zhiting, etc? Analysis of five mainstream smart brands
[Chongqing Guangdong education] higher mathematics I reference materials of Southwest Petroleum University
Zero basic self-study STM32 wildfire review of GPIO use absolute address to operate GPIO
QT release exe software and modify exe application icon
Pat 1046 shortest distance (20 points) simulation
I changed the driver to 5.1.35, but it is still the same error. I can succeed even now, but I will report this every time I do an SQL operation
[Yunju entrepreneurial foundation notes] Chapter II entrepreneur test 6
2020.02.11
微软语音合成助手 v1.3 文本转语音工具,真实语音AI生成器
Introduction to robotframework (II) app startup of appui automation
[matlab] access of variables and files
Template_ Quick sort_ Double pointer
MySQL winter vacation self-study 2022 11 (6)