Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
R
rust-101
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
orestis.malaspin
rust-101
Commits
569be0c3
Verified
Commit
569be0c3
authored
1 year ago
by
Michaël El Kharroubi
Browse files
Options
Downloads
Patches
Plain Diff
Suggestion Orestis
parent
1d0dc450
No related branches found
No related tags found
3 merge requests
!67
Cli toc
,
!63
Cli toc
,
!57
Iterator
Pipeline
#26180
passed
1 year ago
Stage: test
Stage: build
Changes
2
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
book/src/part10.md
+16
-0
16 additions, 0 deletions
book/src/part10.md
codes/rust_lang/part10/src/find.rs
+8
-0
8 additions, 0 deletions
codes/rust_lang/part10/src/find.rs
with
24 additions
and
0 deletions
book/src/part10.md
+
16
−
0
View file @
569be0c3
...
...
@@ -162,20 +162,36 @@ Nous aimerions trouver quel est l'élément le plus petit en valeur absolue d'un
La première étape consiste à créer deux itérateurs. Le premier contient le signe de chaque élément
et le deuxième, la valeur absolue de chaque élément.
```
rust,ignore
{{
#
include
../../
codes
/
rust_lang
/
part10
/
src
/
find
.rs
:
find_absolute_minimum_1
}}
```
Pour obtenir ces itérateurs, nous allons transformer nos itérateurs obtenus avec
`iter()`
en utilsant
la fonction
`map()`
. Cette méthode permet d'appliquer une même transformation sur tous les éléments
d'un itérateur. Pour l'itérateur
`signs`
, on appelle la méthode
`signum()`
des
`i32`
, qui retourne 1 si
le nombre est positif, 0 si le nombre est 0 et -1 si le nombre est négatif. Pour
`abs_values`
,
nous utilisons la méthode
`abs()`
des
`i32`
, qui retourne la valeur absolue d'un nombre.
```
rust,ignore
{{
#
include
../../
codes
/
rust_lang
/
part10
/
src
/
find
.rs
:
find_absolute_minimum_2
}}
```
Maintenant que nous avons nos deux itérateurs, nous aimerions pouvoir itérer sur les deux simultanément.
Pour cela, nous pouvons utiliser la méthode
`zip()`
. Elle permet de transformer deux itérateurs, en un
unique itérateur de tuple. Ici nous avons deux itérateurs de
`i32`
, qui deviennent donc un seul itérateur
de type tuple
`(i32, i32)`
.
```
rust,ignore
{{
#
include
../../
codes
/
rust_lang
/
part10
/
src
/
find
.rs
:
find_absolute_minimum_3
}}
```
Ensuite avec
`fold()`
, il nous suffit de comparer les valeurs absolues et de retourner une option contenant
le signe et la valeur absolue.
```
rust,ignore
{{
#
include
../../
codes
/
rust_lang
/
part10
/
src
/
find
.rs
:
find_absolute_minimum_4
}}
```
Pour finir, on utilise la méthode
`map()`
de notre
`Option<(i32,i32)>`
pour multiplier
la valeur absolue par le signe. Ce qui nous donne au final une
`Option<i32>`
contenant notre résultat.
...
...
This diff is collapsed.
Click to expand it.
codes/rust_lang/part10/src/find.rs
+
8
−
0
View file @
569be0c3
...
...
@@ -80,10 +80,15 @@ pub fn find_even_minimum(v: &Vec<i32>) -> Option<i32> {
/// ```
// ANCHOR: find_absolute_minimum
pub
fn
find_absolute_minimum
(
v
:
&
Vec
<
i32
>
)
->
Option
<
i32
>
{
// ANCHOR: find_absolute_minimum_1
let
signs
=
v
.iter
()
.map
(|
i
|
i
.signum
());
let
abs_values
=
v
.iter
()
.map
(|
i
|
i
.abs
());
// ANCHOR_END: find_absolute_minimum_1
// ANCHOR: find_absolute_minimum_2
signs
.zip
(
abs_values
)
// ANCHOR_END: find_absolute_minimum_2
// ANCHOR: find_absolute_minimum_3
.fold
(
None
,
|
acc
,
(
c_sign
,
c_abs_v
)|
{
let
next_acc
=
if
let
Some
((
sign
,
abs_v
))
=
acc
{
if
abs_v
<=
c_abs_v
{
...
...
@@ -96,6 +101,9 @@ pub fn find_absolute_minimum(v: &Vec<i32>) -> Option<i32> {
};
Some
(
next_acc
)
})
// ANCHOR_END: find_absolute_minimum_3
// ANCHOR: find_absolute_minimum_4
.map
(|(
sign
,
abs_v
)|
sign
*
abs_v
)
// ANCHOR_END: find_absolute_minimum_4
}
// ANCHOR_END: find_absolute_minimum
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment