Rust 1.53.0 est disponible et s'accompagne de IntoIterator pour les tableaux,
Cargo prend désormais en charge les référentiels git où la branche HEAD par défaut n'est pas "master"

L'équipe Rust a annoncé la disponibilité de Rust 1.53.0. Passons en revue les améliorations.

IntoIterator pour les tableaux

Il s'agit de la première version de Rust dans laquelle les tableaux implémentent le trait IntoIterator. Cela signifie que vous pouvez maintenant parcourir les tableaux par valeur*:

Code Rust : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
for i in [1, 2, 3] {
    ..
}

Auparavant, cela n'était possible que par référence, en utilisant &[1, 2, 3] ou [1, 2, 3].iter().

De même, vous pouvez maintenant passer des tableaux aux méthodes qui attendent un T: IntoIterator :

Code Rust : Sélectionner tout - Visualiser dans une fenêtre à part
let set = BTreeSet::from_iter([1, 2, 3]);

Code Rust : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
for (a, b) in some_iterator.chain([1]).zip([1, 2, 3]) {
    ..
}

Cela n'a pas été implémenté auparavant, en raison de problèmes de compatibilité descendante. Étant donné qu'IntoIterator était déjà implémenté pour les références aux tableaux, array.into_iter() déjà compilé dans les versions antérieures, se résolvant en (&array).into_iter().

À partir de cette version, les tableaux implémentent IntoIterator avec une petite solution de contournement pour éviter de casser le code. Le compilateur continuera à résoudre array.into_iter() en (&array).into_iter(), comme si l'implémentation de trait n'existait pas. Cela s'applique uniquement à la syntaxe d'appel de méthode .into_iter() et n'affecte aucune autre syntaxe telle que for e in [1, 2, 3], iter.zip([1, 2, 3]) ou IntoIterator::into_iter ([1, 2, 3]), qui se compilent tous correctement.

Étant donné que ce cas spécial pour .into_iter() n'est requis que pour éviter de casser le code existant, il est supprimé dans la nouvelle édition, Rust 2021, qui sortira plus tard cette année.

Motifs |

La syntaxe du modèle a été étendue pour prendre en charge | imbriqué n'importe où dans le motif. Cela vous permet d'écrire Some(1 | 2) au lieu de Some(1) | Some(2).

Code Rust : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
match result {
     Ok(Some(1 | 2)) => { .. }
     Err(MyError { kind: FileNotFound | PermissionDenied, .. }) => { .. }
     _ => { .. }
}

Identifiants Unicode

Les identifiants peuvent désormais contenir des caractères non ASCII. Tous les caractères d'identification valides en Unicode tels que définis dans UAX #31 peuvent désormais être utilisés. Cela inclut les caractères de nombreux scripts et langages différents, mais n'inclut pas les emoji.

Par exemple :

Nom : exemple.png
Affichages : 3767
Taille : 3,7 Ko

Le compilateur vous avertira des situations potentiellement déroutantes impliquant différents scripts. Par exemple, l'utilisation d'identifiants très similaires entraînera un avertissement.

Code Rust : Sélectionner tout - Visualiser dans une fenêtre à part
warning: identifier pair considered confusable between `s` and `s`

Prise en charge du nom de la branche HEAD dans Cargo

Cargo ne suppose plus que le HEAD par défaut des référentiels git est nommé master. Cela signifie que vous n'avez plus besoin de spécifier branch = "main" pour les dépendances git à partir d'un référentiel où la branche par défaut est appelée main.

La compilation incrémentielle reste désactivée par défaut

La compilation incrémentielle a été désactivée par défaut sur le canal de publication stable de Rust. La fonctionnalité reste disponible sur les canaux de version bêta et nightly. Pour la version stable 1.53.0, la méthode de réactivation incrémentielle est inchangée par rapport à 1.52.1.

API stabilisées

Les méthodes et implémentations de traits suivantes ont été stabilisées :
  • array::from_ref
  • array::from_mut
  • AtomicBool::fetch_update
  • AtomicPtr::fetch_update
  • BTreeSet::retain
  • BTreeMap::retain
  • BufReader::seek_relative
  • cmp::min_by
  • cmp::min_by_key
  • cmp::max_by
  • cmp::max_by_key
  • DebugStruct::finish_non_exhaustive
  • Duration::ZERO
  • Duration::MAX
  • Duration::is_zero
  • Duration::saturating_add
  • Duration::saturating_sub
  • Duration::saturating_mul
  • f32::is_subnormal
  • f64::is_subnormal
  • IntoIterator for array
  • {integer}::BITS
  • io::Error::Unsupported
  • NonZero*::leading_zeros
  • NonZero*::trailing_zeros
  • Option::insert
  • Ordering::is_eq
  • Ordering::is_ne
  • Ordering::is_lt
  • Ordering::is_gt
  • Ordering::is_le
  • Ordering::is_ge
  • OsStr::make_ascii_lowercase
  • OsStr::make_ascii_uppercase
  • OsStr::to_ascii_lowercase
  • OsStr::to_ascii_uppercase
  • OsStr::is_ascii
  • OsStr::eq_ignore_ascii_case
  • Peekable::peek_mut
  • Rc::increment_strong_count
  • Rc::decrement_strong_count
  • slice::IterMut::as_slice
  • AsRef<[T]> for slice::IterMut
  • impl SliceIndex for (Bound<usize>, Bound<usize>)
  • Vec::extend_from_within

Source : blog Rust