DEV Community

Higor Diego
Higor Diego

Posted on

3 2

Rust - Variáveis e mutabilidade

alt text

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:

$ cargo new bin medium
Enter fullscreen mode Exit fullscreen mode

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.


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
*/
Enter fullscreen mode Exit fullscreen mode

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.


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

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

Enter fullscreen mode Exit fullscreen mode

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.


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
*/
Enter fullscreen mode Exit fullscreen mode

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


fn main() {
    let saldo = 30;

    let saldo = 1 + saldo;

    let saldo = 2 + saldo;

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

}
/*

o saldo é: 33

*/

Enter fullscreen mode Exit fullscreen mode

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.


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

*/

Enter fullscreen mode Exit fullscreen mode

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.


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`.
*/

Enter fullscreen mode Exit fullscreen mode

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.

Heroku

Build apps, not infrastructure.

Dealing with servers, hardware, and infrastructure can take up your valuable time. Discover the benefits of Heroku, the PaaS of choice for developers since 2007.

Visit Site

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs