La cobertura de traducción es parcial. Consulte la fuente en inglés para la referencia técnica completa. Ver versión en inglés →

Traits

Define shared behavior across types with trait declarations and implementations.

Traits

Los traits definen interfaces compartidas que multiples tipos pueden implementar. Son el mecanismo de Sounio para polimorfismo acotado (bounded polymorphism) — una funcion puede requerir que su parametro de tipo implemente un trait especifico.

Declarar un trait

trait Printable {
    fn to_string(self) -> str
}

trait Measurable {
    fn magnitude(self) -> f64
}

Implementar un trait

struct Point { x: f64, y: f64 }

impl Printable for Point {
    fn to_string(self) -> str {
        format("({}, {})", self.x, self.y)
    }
}

impl Measurable for Point {
    fn magnitude(self) -> f64 {
        sqrt(self.x * self.x + self.y * self.y)
    }
}

Trait bounds

Usa trait bounds para restringir parametros de tipo genericos:

fn display<T: Printable>(value: T) with IO {
    println(value.to_string())
}

fn compare_magnitudes<T: Measurable>(a: T, b: T) -> bool {
    a.magnitude() > b.magnitude()
}

Donde vive la verificacion de traits

La resolucion de traits esta implementada en self-hosted/check/traits.sio. El verificador comprueba que:

  • Cada bloque impl proporcione todos los metodos requeridos.
  • Las firmas de los metodos en el impl coincidan con la declaracion del trait.
  • Los trait bounds en los sitios de llamada sean satisfechos por el tipo concreto.

Estado actual

Las declaraciones de traits, implementaciones y bounds simples estan soportados por el parser y el verificador de tipos actuales. Funcionalidades mas avanzadas (tipos asociados, metodos por defecto, herencia de traits) se rastrean en la pagina de estado de funcionalidades.