1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
/*
* @Author: lxt
* @Date: 2022-09-14 14:27:23
* @LastEditors: [lxt]
* @LastEditTime: 2022-09-15 11:23:33
* @Description: // #
*/
use std::env;
fn main() {
// iterator_sum();
// iterator_map();
// iterator_closure();
// iterator_1();
iterator_2();
}
fn iterator_sum(){
let v1 = vec![1,2,3,4,5,6];
// sum 会消耗迭代器
let total:i32 = v1.iter().sum();
println!("{}",total);
}
fn iterator_map() {
let v1 = vec![1,2,3,4,5,6];
let v2:Vec<i32> = v1.iter().map(|x|x*10).collect(); // 必须调用消耗迭代器的方法,否则什么都不会做,所有需要调用 collect
println!("{:?}",v2);
}
fn iterator_closure(){
// 闭包捕获环境
struct Shoe{
size:i32,
style:String
}
fn shoes_in_my_size(shoes:Vec<Shoe>,shoe_size:i32)->Vec<Shoe>{
// into_iter 有所有权
shoes.into_iter().filter(|x|x.size>shoe_size).collect()
}
let shoes = vec![
Shoe{size:32,style:String::from("A")},
Shoe{size:12,style:String::from("B")},
Shoe{size:18,style:String::from("C")},
Shoe{size:30,style:String::from("D")},
];
let shoes = shoes_in_my_size(shoes, 20);
for shoe in shoes {
println!("{}:{}",shoe.size,shoe.style);
}
}
fn iterator_1(){
struct Counter{
count:i32
}
impl Counter {
fn new()->Counter{
Counter { count: 0 }
}
}
impl Iterator for Counter{
type Item = i32;
fn next(&mut self)->Option<Self::Item>{
if self.count < 5 {
self.count+=1;
Some(self.count)
}else{
None
}
}
}
let mut counter = Counter::new();
// println!("{}",counter.next().expect("aaa"));
// println!("{}",counter.next().expect("aaa"));
// println!("{}",counter.next().expect("aaa"));
// println!("{}",counter.next().expect("aaa"));
// println!("{}",counter.next().expect("aaa"));
// println!("{}",counter.next().expect("aaa"));
let total:i32 = Counter::new()
.zip( Counter::new().skip(1))
.map(|(a,b)|{
a*b
}).filter(|x| x%3==0)
.sum();
// [1,2,3,4] [2,3,4,5] 相乘,能被3整除的数求和
println!("{}",total)
}
fn iterator_2(){
let config = Config::new(env::args());
struct Config {
query:String,
filename:String
}
impl Config{
fn new(mut args: env::Args)->Result<Config, &'static str>{
if args.len() < 3 {
return Err("not enough arguments");
}
args.next();
// 所有权改进
// let query = args[1].clone();
// let filename = args[2].clone();
let query = args.next().expect("");
let filename = args.next().expect("");
println!("{},{}",query,filename);
Ok(Config{ query,filename})
}
}
}