Clique sobre os tópicos listados abaixo para navegar até o conteúdo desejado.

  1. Discard
  2. Closure interna
  3. Array de closure
  4. Retornando closure
  5. Ponteiro para closure
  6. Recursão

A linguagem Rust possui suporte a Closure. Essa é uma função que não possui nome, atribuída à uma variável durante a declaração, pode possuir parâmetros e retornar um ou mais valores.

Para declarar uma closure em Rust, precisamos seguir a sintaxe 1 básica abaixo. A sintaxe 2 demonstra como invocar um closure:

Sintaxe 1:
let nome_funcao = ||{
  //corpo
};
Sintaxe 2:
nome_funcao()
Exemplo 1
fn main() 
{
    //função anônima sem argumentos
    let funcao1 = || {
        println!("Rust!");    
    };
    
    _funcao1();
}
Saída
Rust!

Funções closures podem ser declaradas e utilizadas dentro de outras funções e comandos da linguagem Rust sendo ser terminadas com ";", pois são declaradas como linha de código e não função.

A informações de parâmetros em função closure é semelhante ao que foi visto para função. Definimos seus nomes e tipos de acordo com o desejado separado-os por (,) como mostrado na sintaxe a seguir:

Sintaxe:
let nome_funcao = |par1: tipo_dado, par2:tipo_dado, parN:tipo_dado|{
  //corpo
};
Sintaxe:
nome_funcao(nome_arg1, nome_arg2, nome_argN);
Exemplo 2
fn main() 
{
    //função anônima com argumentos
    let funcao1 = |arg1:i8, arg2:String| {
        println!("arg1:{} arg2:{}",arg1,arg2);    
    };
    
    funcao1(99,String::from("Hello World"));   
}
Saída
arg1:99 arg2:Hello World

As funções anônimas possuem as mesmas características de funções comuns em relação ao retorno de valores. Podem retornar um ou mais valores e têm a sintaxe semelhante.

Sintaxe:
let nome_funcao = |<parametros>|{
  //corpo
};
Sintaxe:
nome_funcao(<argumentos>);
Exemplo 3
fn main() 
{
    //função anônima com argumentos e retornos
    let funcao1 = |arg1:i8| -> (f32) {
        println!("arg1:{}",arg1);
        return (7.77);
    };
    let (ret1,ret2) = funcao1(99);
    println!("ret1:{}",ret1);
}
Saída
arg1:99
ret1:7.77

A passagem por referência e valor de argumentos é feito da mesma forma visto acima para funções. Os exemplos abaixo mostram respectivamente a passagem por valor e referência:

Exemplo 4: valor
fn main() 
{
    let funcao1 = |mut p:i8| 
    {
        p = p + 1;
        println!("p alterado na função: {}",p);
    };
    
    let p = 99;
    println!("p antes: {}", p);
    funcao1(p);
    println!("p depois: {}",p);
}
Saída
p antes: 99
p alterado na função: 100
p depois: 99
Exemplo 5: Referência
fn main() 
{
    let funcao1 = |p:&mut i8| 
    {
        *p = *p + 1;
        println!("p alterado na função: {}",p);
    };
    
    let mut p = 99;
    println!("p antes: {}", p);
    funcao1(&mut p);
    println!("p depois: {}",p);
}
Saída
p antes: 99
p alterado na função: 100
p depois: 100
  1. 21/08/2023 - versão inicial - Adição: Declaração, 'Closure com parâmetro', 'Closure retornando valor' e 'Valor e Referência'