Rust
Les itérateurs
Recherche…
Introduction
Les itérateurs sont une caractéristique de langage puissante de Rust, décrite par le trait
Iterator
. Les itérateurs vous permettent d'effectuer de nombreuses opérations sur des types de type collection, par exemple Vec<T>
, et sont facilement composables.
Adaptateurs et consommateurs
Les méthodes d'itérateur peuvent être divisées en deux groupes distincts:
Adaptateurs
Les adaptateurs prennent un itérateur et renvoient un autre itérateur
// Iterator Adapter
// | |
let my_map = (1..6).map(|x| x * x);
println!("{:?}", my_map);
Sortie Map { iter: 1..6 }
Notez que les valeurs n'ont pas été énumérées, ce qui indique que les itérateurs ne sont pas évalués avec impatience - les itérateurs sont "paresseux".
Les consommateurs
Les consommateurs prennent un itérateur et retournent autre chose qu'un itérateur, consommant l'itérateur dans le processus.
// Iterator Adapter Consumer
// | | |
let my_squares: Vec<_> = (1..6).map(|x| x * x).collect();
println!("{:?}", my_squares);
Sortie [1, 4, 9, 16, 25]
Parmi les autres exemples de consommateurs, citons find
, fold
et sum
.
let my_squared_sum: u32 = (1..6).map(|x| x * x).sum();
println!("{:?}", my_squared_sum);
Sortie 55
Un test de primalité court
fn is_prime(n: u64) -> bool {
(2..n).all(|divisor| n % divisor != 0)
}
Bien sûr, ce n'est pas un test rapide. Nous pouvons arrêter de tester à la racine carrée de n
:
(2..n)
.take_while(|divisor| divisor * divisor <= n)
.all(|divisor| n % divisor != 0)
Itérateur personnalisé
struct Fibonacci(u64, u64);
impl Iterator for Fibonacci {
type Item = u64;
// The method that generates each item
fn next(&mut self) -> Option<Self::Item> {
let ret = self.0;
self.0 = self.1;
self.1 += ret;
Some(ret) // since `None` is never returned, we have an infinite iterator
}
// Implementing the `next()` method suffices since every other iterator
// method has a default implementation
}
Exemple d'utilisation:
// the iterator method `take()` is an adapter which limits the number of items
// generated by the original iterator
for i in Fibonacci(0, 1).take(10) {
println!("{}", i);
}
Modified text is an extract of the original Stack Overflow Documentation
Sous licence CC BY-SA 3.0
Non affilié à Stack Overflow