where |
Où |
|---|---|
| Rust | |
Syntaxe
|
fn nom_fonction<T, U>(param: T) -> U where T: Trait1 + Trait2, U: Trait3, { // corps de la fonction } |
Paramètres
| Nom | Description |
|---|---|
| T: Trait1 + Trait2 | Ce paramètre permet de contraindre le type T à implémenter les traits Trait1 et Trait2, définissant ses capacités. |
| U: Trait3 | Ce paramètre permet de contraindre le type U à implémenter le trait Trait3, assurant une interface ou comportement spécifique. |
Description
Ce mot réservé permet de dénoter des clauses contraignant un type.
Remarques
Ajoutez des contraintes à respecter pour utiliser un élément.
where permet de spécifier des contraintes sur la durée de vie et les paramètres génériques. La RFC introduisant where contient des informations détaillées sur le mot-clef.
Exemples
where peut être utilisé pour les contraintes avec des traits :
Où peut également être utilisé pour les durées de vie.
Ceci est compilé car une durée de vie plus longue est supérieure à une durée de vie plus courte, la contrainte est donc respectée :
- fn select<'short, 'long>(s1: &'short str, s2: &'long str, second: bool) -> &'short str
- where
- 'long: 'short,
- {
- if second { s2 } else { s1 }
- }
-
- let outer = String::from("Longue vie ref");
- let longer = &outer;
- {
- let inner = String::from("Ref de courte durée");
- let shorter = &inner;
-
- assert_eq!(select(shorter, longer, false), shorter);
- assert_eq!(select(shorter, longer, true), longer);
- }
D'un autre côté, cela ne compilera pas car la clause where 'b: 'a est manquante : la durée de vie de 'b n'est pas connue pour durer au moins aussi longtemps que 'a, ce qui signifie que cette fonction ne peut pas garantir qu'elle renvoie toujours une référence valide :
où peut également être utilisé pour exprimer des contraintes plus complexes qui ne peuvent pas être écrites avec la syntaxe <T: Trait> :
où est disponible partout où les paramètres génériques et à vie sont disponibles, comme on peut le voir avec le type Cow de la bibliothèque standard :