Pular para o conteúdo

Sobrecarga de operadores

Fazer +, == e < funcionarem no seu próprio tipo.

dataforge
blueprint Vetor:
    x: Float := 0.0
    y: Float := 0.0

    action setup(x, y):
        self.x := x
        self.y := y

    operator + (o):
        yield spawn Vetor(self.x + o.x, self.y + o.y)

    operator - (o):
        yield spawn Vetor(self.x - o.x, self.y - o.y)

    operator * (k):
        yield spawn Vetor(self.x * k, self.y * k)

    operator == (o):
        yield self.x is o.x and self.y is o.y

    get comprimento():
        yield sqrt(self.x ** 2 + self.y ** 2)

    action toString():
        yield $"({self.x}, {self.y})"

Quando vale#

Só quando a operação é óbvia: somar dois vetores, comparar dois valores monetários, concatenar duas listas. Se alguém precisa ler a documentação para saber o que + faz no seu tipo, um método com nome é melhor.

O que dá para sobrecarregar#

GrupoOperadores
Aritméticos+ - * / % **
Igualdade== (e is)
Ordem< > <= >= — e os equivalentes smaller, bigger

Tentar outro símbolo dá erro listando os aceitos:

text
erro[DF0103]: '@' cannot be overloaded. You can overload: !=, %, *, **, +, -, /, <, <=, ==, >, >=

`isnt` vem de graça#

Declarar operator == já faz isnt funcionar — não é preciso declarar os dois. O mesmo não vale para < e >: eles são operações diferentes.

Regras#

  • + deve devolver um valor novo, não alterar selfa + b que muda a surpreende quem lê
  • Operadores são herdados: um filho ganha os do pai sem redeclarar
  • Operador não comutativo (-, /, <) só é tentado no lado esquerdo: 2 * vetor não funciona se só Vetor define *