Objetivos
Clique sobre os tópicos listados abaixo para navegar até o conteúdo desejado.
Discard
Closure interna
Array de closure
Retornando closure
Ponteiro para closure
Recursão
Closure
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.
Declaração
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
Passagem por valor e referência
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
Histórico de atualizações
- 21/08/2023 - versão inicial - Adição: Declaração, 'Closure com parâmetro', 'Closure retornando valor' e 'Valor e Referência'
Os cursos oferecidos nesta página são cursos fornecidos por parceiros. Ao comprar um curso clicando
em seu banner, você está ajudando a manter o projeto TutorialDev vivo. Os sites dos cursos parceiros utilizam cookies.