Nesta página
Operadores
Operadores Aritméticos¶
| Operador | Descrição | Exemplo |
|---|---|---|
+ |
Adição | 3 + 2 → 5 |
- |
Subtração | 10 - 4 → 6 |
* |
Multiplicação | 3 * 4 → 12 |
/ |
Divisão | 10 / 3 → 3 |
% |
Módulo | 10 % 3 → 1 |
** |
Exponenciação | 2 ** 8 → 256 |
Operadores de Comparação¶
| Operador | Descrição | Exemplo |
|---|---|---|
== |
Igual | x == 5 |
!= |
Diferente | x != 0 |
< |
Menor que | x < 10 |
> |
Maior que | x > 0 |
<= |
Menor ou igual | x <= 100 |
>= |
Maior ou igual | x >= 1 |
Operadores Lógicos¶
| Operador | Descrição | Exemplo |
|---|---|---|
&& |
E lógico | a && b |
|| |
OU lógico | a || b |
! |
NÃO lógico | !flag |
Operadores de Atribuição¶
| Operador | Descrição | Exemplo |
|---|---|---|
= |
Atribuição | x = 10 |
+= |
Somar e atribuir | x += 5 |
-= |
Subtrair e atribuir | x -= 3 |
*= |
Multiplicar e atribuir | x *= 2 |
/= |
Dividir e atribuir | x /= 4 |
%= |
Módulo e atribuir | x %= 3 |
Operador Pipe |>¶
O operador pipe passa a expressão à esquerda como o primeiro argumento para a função à direita. Isso cria um fluxo de dados natural de cima para baixo:
// Without pipe — hard to read (inside-out)
let result = collect(filter(map(list, |x| x * 2), |x| x > 5))
// With pipe — natural flow
let result = list
|> map(|x| x * 2)
|> filter(|x| x > 5)
|> collect()Como Funciona¶
a |> f(b, c) transforma em f(a, b, c) — o lado esquerdo torna-se o primeiro argumento.
" Hello World "
|> string.trim()
|> string.split(" ")
|> Array.map(|s| string.to_upper(s))
|> Array.join(", ")Pipe com Placeholder _¶
Quando o valor passado pelo pipe não deve ser o primeiro argumento:
users
|> sort(_, by: .name)
|> group(_, key: |u| u.age)Operador Tap &.¶
Executa um efeito colateral sem interromper a cadeia — o valor original passa inalterado. Perfeito para depuração e logging:
list
|> sort()
&. print() // prints the sorted list, passes it along
|> filter(|x| x > 0)
&. |x| log(x) // debug log
|> collect()Como Funciona¶
a &. f() chama f(a) pelo efeito colateral e então retorna a inalterado.
Encadeamento Opcional ?.¶
Acessa campos com segurança em valores que podem ser nil:
let city = user?.address?.city // nil if any part is nilSem encadeamento opcional, você precisaria de verificações aninhadas de nil:
// Equivalent without ?.
let city = if user != nil {
if user.address != nil {
user.address.city
} else { nil }
} else { nil }Coalescência Nula ??¶
Fornece um valor padrão quando o lado esquerdo é nil:
let name = user?.name ?? "Anonymous"
let port = config?.port ?? 8080Combinando com Encadeamento Opcional¶
let city = user?.address?.city ?? "unknown"Propagação de Erro ?¶
Propaga erros para cima na pilha de chamadas, similar ao Rust:
fn read_config(path: str) -> Result<Config, Error> {
let text = fs.read(path)? // returns early on error
let config = json.parse(text)?
Result.Ok(config)
}Quando ? é aplicado a um Result.Err, a função retorna imediatamente com esse erro. Quando aplicado a Result.Ok(value), desempacota para value.
Operadores de spread¶
Zolo usa duas grafias de propósito:
...valorexpande um array dentro de um literal de array...valorcopia campos dentro de um literal de struct nomeada.
let a = [1, 2, 3]
let b = [0, ...a, 4, 5]
print(b)
struct User {
name: str,
age: int,
}
let alice = User { name: "Alice", age: 30 }
let bob = User { name: "Bob", ..alice }
print("{bob.name} tem {bob.age} anos")Saída:
[0, 1, 2, 3, 4, 5]
Bob tem 30 anosCampos nomeados têm precedência sobre os campos copiados, portanto
name: "Bob" substitui alice.name. Uma cópia pura é User { ..alice }.
Literais de mapa usam #{ chave: valor }; { ...map } não é sintaxe de
spread de mapa.
Operadores de Intervalo¶
| Operador | Descrição | Exemplo |
|---|---|---|
.. |
Intervalo exclusivo | 0..10 → 0 a 9 |
..= |
Intervalo inclusivo | 0..=10 → 0 a 10 |
for i in 0..5 { // 0, 1, 2, 3, 4
print(i)
}
for i in 0..=5 { // 0, 1, 2, 3, 4, 5
print(i)
}Precedência de Operadores¶
Do maior para o menor:
- Unário:
-x,!x - Exponenciação:
** - Multiplicativo:
*,/,% - Aditivo:
+,- - Intervalo:
..,..= - Comparação:
<,>,<=,>= - Igualdade:
==,!= - E lógico:
&& - OU lógico:
|| - Coalescência nula:
?? - Pipe:
|> - Tap:
&. - Atribuição:
=,+=,-=,*=,/=,%=