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
implproporcione todos los metodos requeridos. - Las firmas de los metodos en el
implcoincidan 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.