A cobertura de tradução é parcial. Consulte a fonte em inglês para a referência técnica completa. Ver versão em inglês →

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 impl fornece todos os metodos requeridos.
  • As assinaturas dos metodos no impl correspondem 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.