Quando simplesmente passamos um valor ou variável como argumento para uma função estamos
passando apenas seu valor. Depois de usado, internamente na função através do parâmetro,
esse valor será destruído.
Para que um parâmetro tenha seu valor alterado dentro de uma função, esse parâmetro deve ser
declarado como mut como mostrado no exemplo a seguir:
Exemplo 7
fn funcao(mut p: i8)
{
p = p + 1; //mut para alteração
println!("p alterado na função: {}",p);
//p descartado
}
fn main()
{
let p: i8 = 1;
println!("p antes: {}",p);
funcao(p); //passagem por valor
println!("p depois: {}",p);
}
Saída
p antes: 1
p alterado na função: 2
p depois: 1
Para passarmos um argumento por referência para que seja alterado seu conteúdo de forma
permanente, precisamos passar uma referência da variável que desejamos alterar.
De forma "semelhante" à C/C++, usamos os operadores (&) e (*). A palavra mut é prefixado
com (&) para informar que o parâmetro que irá receber uma referência. O operador (*) é
prefixado ao nome do parâmetro para acessar seu conteúdo de forma indireta.
Exemplo 8
fn funcao(p: &mut i8)
{
*p = *p + 1;
println!("p alterado na função: {}",p);
}
fn main()
{
let mut p: i8 = 1;
println!("p antes: {}",p);
funcao(&mut p);
println!("p depois: {}",p);
}
Saída
p antes: 1
p alterado na função: 2
p depois: 2