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 |
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 |
let set = BTreeSet::from_iter([1, 2, 3]);
Code Rust : | Sélectionner tout |
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 |
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 :
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 |
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