Traits
Define shared behavior across types with trait declarations and implementations.
Traits
Traits definem interfaces compartilhadas que multiplos tipos podem implementar. Elas sao o mecanismo de Sounio para polimorfismo limitado (bounded polymorphism) — uma funcao pode exigir que seu parametro de tipo implemente uma trait especifica.
Declarando uma trait
trait Printable {
fn to_string(self) -> str
}
trait Measurable {
fn magnitude(self) -> f64
}
Implementando uma 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
Use 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()
}
Onde o trait checking e implementado
A resolucao de traits esta implementada em self-hosted/check/traits.sio. O verificador garante que:
- Todo bloco
implfornece todos os metodos requeridos. - As assinaturas dos metodos no
implcorrespondem a declaracao da trait. - Trait bounds nos locais de chamada sao satisfeitos pelo tipo concreto.
Status atual
Declaracoes de traits, implementacoes e bounds simples sao suportados pelo parser e type checker atuais. Funcionalidades mais avancadas (tipos associados, metodos default, heranca de traits) sao rastreadas na pagina de status de features.