Skip to content
Snippets Groups Projects
Commit 2044d71f authored by orestis.malaspin's avatar orestis.malaspin
Browse files

ajout adapter

parent fdd8cfa4
No related branches found
No related tags found
No related merge requests found
Pipeline #
...@@ -109,9 +109,79 @@ fn main() { ...@@ -109,9 +109,79 @@ fn main() {
println!("{:?}", fib.next()); println!("{:?}", fib.next());
let fib4 = fib.take(4); // retourne les 4 prochains éléments de l'itérateur let fib4 = fib.take(4); // retourne les 4 prochains éléments de l'itérateur
for i in fib4 { for i in fib4 {
println!("{}", i); println!("{}", i);
} }
} }
</code></pre> </code></pre>
## Utilisations des itérateurs
- Un itérateur donne une séquence de valeurs.
- Un **adaptateur d'térateur** (iterator adapter) qui s'applique sur un itérateur produisant un nouvel itérateur.
- Un **consommateur** qui s'applique sur un adaptateur rendant un ensemble de valeurs et "détruisant" l'itérateur.
# Consommateur d'itérateur
Un consommateur "consomme" un itérateur et retourne une (ou un ensemble) de valeurs.
- `.collect()`{.rust}, `.find()`{.rust}, `.fold()`{.rust}, ...
## Exemples (1/2)
<pre><code data-trim="hljs rust" class="lang-rust">
fn main() {
let v = vec![0, 4, 7, 9, 15];
let v_iter = v.iter();
let sum: i32 = v_iter.sum(); // l'itérateur est détruit et on a calculé la somme des éléments
println!("La somme est un consommateur: {}", sum);
// println!("L'itérateur: {:?}", v_iter);
}
</code></pre>
## Exemples (2/2)
<pre><code data-trim="hljs rust" class="lang-rust">
fn main() {
let v = 0..10;
let v_vec = v.collect::&lt;Vec&lt;i32&gt;&gt;(); // l'itérateur est détruit et transformé en Vec
println!("Iter {:?}", v_vec);
// println!("Range {:?}", v);
}
</code></pre>
# Adaptateur d'itérateur
Un adaptateur "adapte" un itérateur et retourne un itérateur.
## Exemples (1/2)
- `.map()`{.rust} prend une fonction anonyme (closure) en paramètre et l'applique à chaque élément.
<pre><code data-trim="hljs rust" class="lang-rust">
fn main() {
let v = vec![0, 4, 7, 9, 15];
// iter() retourne un itérateur vers des références de v
v.iter().map(|x| x + 1).map(|y| println!("{}", y)); // n'est pas consommé, rust ne fera rien ("lazy").
let add_v: Vec&lt;i32&gt; = v.iter().map(|x| x + 1).collect();
println!("{:?}", add_v);
}
</code></pre>
## Exemples (2/2)
- `.filter()`{.rust} prend prédicat et retourne un itérateur satisfaisant le prédicat.
<pre><code data-trim="hljs rust" class="lang-rust">
fn main() {
let v = vec![0, 4, 7, 9, 15];
// into_iter() retourne un itérateur vers les valeurs de v (v disparaît)
let fil_v: Vec&lt;i32&gt; = v.into_iter().filter(|x| *x > 7).collect();
println!("{:?}", fil_v);
// let fil_t2_v: Vec&lt;i32&gt; = v.into_iter().filter(|x| *x > 7).map(|y| 3*y).collect();
// println!("{:?}", fil_v);
}
</code></pre>
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment