Skip to main content

Return | Rust

  • Return | Rust

Retorno de valores em funções no Rust

No Rust, o retorno de valores segue um modelo baseado em expressões, o que faz com que o uso explícito de return nem sempre seja necessário. Esse comportamento é intencional e faz parte do estilo idiomático da linguagem.


Retorno implícito por expressão final

Em Rust, a última expressão de um bloco é retornada automaticamente, desde que não termine com ponto e vírgula (;).

fn soma(a: i32, b: i32) -> i32 {
a + b
}

Nesse exemplo:

  • a + b é uma expressão
  • não há ;
  • o valor é retornado implicitamente

Esse é o padrão mais comum e recomendado 🦀


Uso explícito de return

A palavra-chave return existe e pode ser usada para retornar um valor imediatamente.

fn soma(a: i32, b: i32) -> i32 {
return a + b;
}

Embora funcione corretamente, esse estilo é menos idiomático quando usado no final da função.


Quando o uso de return é recomendado

Retorno antecipado

return é útil quando você precisa encerrar a função antes do final do bloco.

fn dividir(a: i32, b: i32) -> Option<i32> {
if b == 0 {
return None;
}

Some(a / b)
}

Fluxos condicionais complexos

Em funções com múltiplos caminhos de saída, o return pode melhorar a legibilidade.

fn classificar(idade: u8) -> &'static str {
if idade < 18 {
return "menor";
}

"adulto"
}

Importância do ponto e vírgula

Adicionar ; ao final da última linha impede o retorno do valor.

fn soma(a: i32, b: i32) -> i32 {
a + b; // erro
}

Nesse caso, a expressão passa a retornar () (unit), causando erro de tipo.


Retorno em blocos condicionais

Blocos if, match e loop também são expressões e podem retornar valores.

fn valor(x: i32) -> i32 {
if x > 0 {
x * 2
} else {
x - 2
}
}

Todos os ramos devem retornar o mesmo tipo.


Regra prática de leitura

  • Última linha sem ; → retorno implícito
  • Uso de return → retorno imediato
  • Última linha com ; → nenhum valor retornado
  • Blocos são expressões, não apenas comandos