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#
| Grupo | Operadores |
|---|---|
| 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 alterarself—a + bque mudaasurpreende quem lê- Operadores são herdados: um filho ganha os do pai sem redeclarar
- Operador não comutativo (
-,/,<) só é tentado no lado esquerdo:2 * vetornão funciona se sóVetordefine*