Edited the iterator.md
This commit is contained in:
parent
1a5bdaaf77
commit
eb00e97b2a
|
@ -11,7 +11,7 @@ fn main() {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
In above code, You may consider `for` as a simple loop, but actually it is iterating over a iterator.
|
In the code above, You may consider `for` as a simple loop, but actually it is iterating over a iterator.
|
||||||
|
|
||||||
By default `for` will apply the `into_iter` to the collection, and change it into a iterator. As a result, the following code is equivalent to previous one:
|
By default `for` will apply the `into_iter` to the collection, and change it into a iterator. As a result, the following code is equivalent to previous one:
|
||||||
```rust
|
```rust
|
||||||
|
@ -23,18 +23,18 @@ fn main() {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
1γπ
|
1.π
|
||||||
```rust,editable
|
```rust,editable
|
||||||
/* Refactoring the following code using iterators */
|
/* Refactoring the following code using iterators */
|
||||||
fn main() {
|
fn main() {
|
||||||
let arr = [0; 10];
|
let arr = [0; 10];
|
||||||
for i in 0..arr.len() {
|
for i in 0..arr.len() {
|
||||||
println!("{}",arr[i])
|
println!("{}",arr[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
2γ π One of the easiest ways to create an iterator is to use the range notion: `a..b`.
|
2. π One of the easiest ways to create an iterator is to use the range notion: `a..b`.
|
||||||
```rust,editable
|
```rust,editable
|
||||||
/* Fill in the blank */
|
/* Fill in the blank */
|
||||||
fn main() {
|
fn main() {
|
||||||
|
@ -55,13 +55,13 @@ pub trait Iterator {
|
||||||
|
|
||||||
fn next(&mut self) -> Option<Self::Item>;
|
fn next(&mut self) -> Option<Self::Item>;
|
||||||
|
|
||||||
// methods with default implementations elided
|
// Methods with default implementations elided
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
And we can call the `next` method on iterators directly.
|
And we can call the `next` method on iterators directly.
|
||||||
|
|
||||||
3γππ
|
3.ππ
|
||||||
```rust,editable
|
```rust,editable
|
||||||
/* Fill the blanks and fix the errors.
|
/* Fill the blanks and fix the errors.
|
||||||
Using two ways if possible */
|
Using two ways if possible */
|
||||||
|
@ -75,28 +75,28 @@ fn main() {
|
||||||
```
|
```
|
||||||
|
|
||||||
## into_iter, iter and iter_mut
|
## into_iter, iter and iter_mut
|
||||||
In the previous section, we have mentioned that `for` will apply the `into_iter` to the collection, and change it into a iterator.However, this is not the only way to convert collections into iterators.
|
In the previous section, we have mentioned that `for` will apply the `into_iter` to the collection, and change it into a iterator. However, this is not the only way to convert collections into iterators.
|
||||||
|
|
||||||
`into_iter`, `iter`, `iter_mut`, all of them can convert an collection into iterator, but in different ways.
|
`into_iter`, `iter`, `iter_mut`, all of them can convert a collection into iterator, but in different ways.
|
||||||
|
|
||||||
- `into_iter` cosumes the collection, once the collection has been comsumed, it is no longer available for reuse, because its ownership has been moved within the loop.
|
- `into_iter` consumes the collection, once the collection has been consumed, it is no longer available for reuse, because its ownership has been moved within the loop.
|
||||||
- `iter`, this borrows each element of the collection through each iteration, thus leaving the collection untouched and available for reuse after the loop
|
- `iter`, this borrows each element of the collection through each iteration, thus leaving the collection untouched and available for reuse after the loop
|
||||||
- `iter_mut`, this mutably borrows each element of the collection, allowing for the collection to be modified in place.
|
- `iter_mut`, this mutably borrows each element of the collection, allowing for the collection to be modified in place.
|
||||||
|
|
||||||
4γπ
|
4.π
|
||||||
```rust,editable
|
```rust,editable
|
||||||
/* Make it work */
|
/* Make it work */
|
||||||
fn main() {
|
fn main() {
|
||||||
let arr = vec![0; 10];
|
let arr = vec![0; 10];
|
||||||
for i in arr {
|
for i in arr {
|
||||||
println!("{}", i)
|
println!("{}", i);
|
||||||
}
|
}
|
||||||
|
|
||||||
println!("{:?}",arr);
|
println!("{:?}",arr);
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
5γπ
|
5.π
|
||||||
```rust,editable
|
```rust,editable
|
||||||
/* Fill in the blank */
|
/* Fill in the blank */
|
||||||
fn main() {
|
fn main() {
|
||||||
|
@ -113,7 +113,7 @@ fn main() {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
6γππ
|
6.ππ
|
||||||
```rust,editable
|
```rust,editable
|
||||||
/* Fill in the blank */
|
/* Fill in the blank */
|
||||||
fn main() {
|
fn main() {
|
||||||
|
@ -130,7 +130,7 @@ fn main() {
|
||||||
|
|
||||||
|
|
||||||
## Creating our own iterator
|
## Creating our own iterator
|
||||||
We can not only create iterators from collections types, but also can create iterators by implementing the `Iterator` trait on our own types.
|
We can not only create iterators from collection's types, but also can create iterators by implementing the `Iterator` trait on our own types.
|
||||||
|
|
||||||
**Example**
|
**Example**
|
||||||
```rust
|
```rust
|
||||||
|
@ -169,7 +169,7 @@ fn main() {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
7γπππ
|
7.πππ
|
||||||
```rust,editable
|
```rust,editable
|
||||||
struct Fibonacci {
|
struct Fibonacci {
|
||||||
curr: u32,
|
curr: u32,
|
||||||
|
@ -208,8 +208,8 @@ The `Iterator` trait has a number of methods with default implementations provid
|
||||||
### Consuming adaptors
|
### Consuming adaptors
|
||||||
Some of these methods call the method `next`to use up the iterator, so they are called *consuming adaptors*.
|
Some of these methods call the method `next`to use up the iterator, so they are called *consuming adaptors*.
|
||||||
|
|
||||||
8γππ
|
8.ππ
|
||||||
```rust,edtiable
|
```rust,editable
|
||||||
/* Fill in the blank and fix the errors */
|
/* Fill in the blank and fix the errors */
|
||||||
fn main() {
|
fn main() {
|
||||||
let v1 = vec![1, 2, 3];
|
let v1 = vec![1, 2, 3];
|
||||||
|
@ -226,10 +226,10 @@ fn main() {
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
#### collect
|
#### Collect
|
||||||
Other than converting a collection into an iterator, we can also `collect` the result values into a collection, `collect` will cosume the iterator.
|
Other than converting a collection into an iterator, we can also `collect` the result values into a collection, `collect` will consume the iterator.
|
||||||
|
|
||||||
9γππ
|
9.ππ
|
||||||
```rust,editable
|
```rust,editable
|
||||||
/* Make it work */
|
/* Make it work */
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
@ -251,9 +251,9 @@ fn main() {
|
||||||
### Iterator adaptors
|
### Iterator adaptors
|
||||||
Methods allowing you to change one iterator into another iterator are known as *iterator adaptors*. You can chain multiple iterator adaptors to perform complex actions in a readable way.
|
Methods allowing you to change one iterator into another iterator are known as *iterator adaptors*. You can chain multiple iterator adaptors to perform complex actions in a readable way.
|
||||||
|
|
||||||
But because **all iterators are lazy**, you have to call one of the consuming adapers to get results from calls to iterator adapters.
|
But because **all iterators are lazy**, you have to call one of the consuming adapters to get results from calls to iterator adapters.
|
||||||
|
|
||||||
10γππ
|
10.ππ
|
||||||
```rust,editable
|
```rust,editable
|
||||||
/* Fill in the blanks */
|
/* Fill in the blanks */
|
||||||
fn main() {
|
fn main() {
|
||||||
|
@ -265,7 +265,7 @@ fn main() {
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
11γππ
|
11.ππ
|
||||||
```rust
|
```rust
|
||||||
/* Fill in the blanks */
|
/* Fill in the blanks */
|
||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
|
@ -281,7 +281,7 @@ fn main() {
|
||||||
|
|
||||||
#### Using closures in iterator adaptors
|
#### Using closures in iterator adaptors
|
||||||
|
|
||||||
12γππ
|
12.ππ
|
||||||
```rust
|
```rust
|
||||||
/* Fill in the blanks */
|
/* Fill in the blanks */
|
||||||
#[derive(PartialEq, Debug)]
|
#[derive(PartialEq, Debug)]
|
||||||
|
|
Loadingβ¦
Reference in New Issue