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

Simplify your DevOps and maximize your time.

Since 2007, Heroku has been the go-to platform for developers as it monitors uptime, performance, and infrastructure concerns, allowing you to focus on writing code.

Learn More

Top comments (0)

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay