Rust - Variáveis e mutabilidade
Tags: rust, introduction, variables, mutability
Published: 2021-09-26 17:35:14


![alt text](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/phgth72u1bz55e0ou15a.jpeg)

Entendendo como funciona variáveis e mutabilidade no Rust.

Por padrão no Rust as variáveis declaradas são imutáveis, essa é uma das maneiras do rust trazer seguranças para o código mas não quer dizer que não pode ser mutáveis.

Vamos criar um projeto simples com o cargo, executando o simples comando:

```sh
$ cargo new bin medium
```

Vamos para o arquivo */src/main.rs* e declaramos uma variável chamado saldo com o valor de 30 e após a impressão com o *println!* adicionaremos outro valor para que possamos vê se realmente irá mudar.

```rust

fn main() {
    let saldo = 30;
    println!("o saldo é : {}", saldo);
    saldo = 36;
    println!("o saldo é : {}", saldo);
}

/*
error[E0384]: cannot assign twice to immutable variable `saldo`
  --> main.rs:21:5
   |
19 |     let saldo = 30;
   |         ----- first assignment to `saldo`
20 |     println!("o saldo é : {}", saldo);
21 |     saldo = 36;
   |     ^^^^^^^^^^ cannot assign twice to immutable variable
*/
```

Nesse simples experimento o compilador informa que a variável saldo não pode rescrever outro valor porque como o próprio compilador diz *“cannot assign twice to immutable variable”* não pode atribuir duas vezes a variável imutável.

Em Rust, o compilador garante que quando você declara uma variável por padrão será imutável caso queira que seja mutável coloque mut na frente da declaração.


```rust

fn main() {
    let mut saldo = 30;
    println!("o saldo é : {}", saldo);
    saldo = 36;
    println!("o saldo é : {}", saldo);
}

/*
  o saldo é : 30
  o saldo é : 36
*/

```

Temos uma diferença entre variáveis mutáveis e constantes, nas constantes não poderá usar o *mut* pois não são só imutáveis por padrão, constantes são sempre imutáveis. Para declarar uma variável constante basta usar const.

```rust

fn main() {
    const mut saldo = 30;
    println!("o saldo é : {}", saldo);
    saldo = 36;
    println!("o saldo é : {}", saldo);
}

/*
error: const globals cannot be mutable
  --> main.rs:19:11
   |
19 |     const mut saldo = 30;
   |           ^^^
   |
   = help: did you mean to declare a static?

error: expected `:`, found `=`
  --> main.rs:19:21
   |
19 |     const mut saldo = 30;
   |                     ^ expected `:`

error: aborting due to 2 previous errors
*/
```

Uma outra diferença entre *mut* é shadowing que consiste em criar uma nova variável com o mesmo nome usando a palavra-chave *let*.

```rust

fn main() {
    let saldo = 30;

    let saldo = 1 + saldo;

    let saldo = 2 + saldo;

    println!("o saldo é: {}", saldo)

}
/*

o saldo é: 33

*/

```

Mas teremos um porém se atribuir uma valor sem o *let* irá acontecer o error em tempo de compilação pois o *shadowing* é bem diferente do que dizer que uma variável é *mut*.

```rust

fn main() {
    let saldo = 30;

    saldo = 1 + saldo;

    let saldo = 2 + saldo;

    println!("o saldo é: {}", saldo)
}

/*
error[E0384]: cannot assign twice to immutable variable `saldo`
  --> main.rs:24:5
   |
22 |     let saldo = 30;
   |         ----- first assignment to `saldo`
23 |
24 |     saldo = 1 + saldo;
   |     ^^^^^^^^^^^^^^^^^ cannot assign twice to immutable variable

*/

```

Teremos o error no tempo de compilação *“cannot assign twice to immutable variable”* não pode atribuir duas vezes a variável imutável. Isso também vale para o tipo dela por exemplo.


```rust

fn main() {
    let name = "Higor Diego";
    name = 2;
}

/*
error[E0308]: mismatched types
  --> main.rs:21:12
   |
21 |     name = 2;
   |            ^ expected &str, found integral variable
   |
   = note: expected type `&str`
              found type `{integer}`

error: aborting due to previous error

For more information about this error, try `rustc --explain E0308`.
*/

```

O error informa que = note: *expected type `&str` found type `{integer}`* que a variável espera um string e não inteiro.

Então galera é isso, espero que tenham gostado até a próxima.