Cláusulas where

Un vínculo también se puede expresar usando una cláusula where inmediatamente antes de la apertura {, en lugar de en la primera mención del tipo. Además, las cláusulas where pueden aplicar vínculos a tipos arbitrarios, en lugar de solo a parámetros de tipo.

Algunos casos en los que una cláusula where es útil:

  • Cuando especificar vínculos y tipos genéricos por separado es más claro:
impl <A: TraitB + TraitC, D: TraitE + TraitF> MiTrait<A, D> for TuTipo {}

// Expresar vínculos con una cláusula where
impl <A, D> MiTrait<A, D> for TuTipo where
    A: TraitB + TraitC,
    D: TraitE + TraitF {}
  • Cuando se usa una cláusula where es más expresiva que usar la sintaxis normal. El impl en este ejemplo no se puede expresar directamente sin una cláusula where:
use std::fmt::Debug;

trait PrintEnOption {
    fn print_en_option(self);
}

// Porque de lo contrario tendríamos que expresar esto como `T: Debug` o usa otro método
// de enfoque indirecto, esto requiere una cláusula `where`:
impl<T> PrintEnOption for T where
    Option<T>: Debug {
    // Queremos `Option<T>: Debug` como nuestro vínculo porque eso es lo que está siendo
    // impreso. Hacer lo contrario sería utilizar el vínculo incorrecto.
    fn print_en_option(self) {
        println!("{:?}", Some(self));
    }
}

fn main() {
    let vec = vec![1, 2, 3];

    vec.print_en_option();
}

Ve también

RFC, struct, y trait