English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Gramática Básica do Rust

Variável, tipos básicos, funções, comentários e controle de fluxo, esses são quase conceitos de programação que cada linguagem de programação possui.

Esses conceitos básicos existirão em cada programa Rust, e aprender cedo eles tornarão você aprender o uso do Rust mais rápido.

Variável

Primeiro, deve-se esclarecer que o Rust é uma linguagem de tipo forte, mas possui a capacidade de julgar automaticamente o tipo de variável. Isso é fácil de confundir com linguagens de tipo fraco.

Para declarar uma variável, é necessário usar a palavra-chave let. Por exemplo:

let a = 123;

Desenvolvedores que aprenderam apenas JavaScript são sensíveis a essa frase, enquanto desenvolvedores que aprenderam apenas C não entendem essa frase.

Depois dessa declaração de sentença, os três seguintes códigos são proibidos:

a = "abc";
a = 4.56; 
a = 456;

O erro na primeira linha está em declarar a como 123 A partir de agora, a a será determinada como um número inteiro e não pode receber valores do tipo string.

O erro na segunda linha está na perda de precisão na conversão automática de números, o Rust não permite conversões automáticas de tipos de dados que perdem precisão.

O erro na terceira linha está em a não ser uma variável mutável.

Os dois primeiros erros são fáceis de entender, mas o terceiro é o que quer dizer? A a não é uma variável?

Isso envolve o design que o Rust fez para segurança de alta concorrência: no nível da linguagem, tentar ao máximo limitar a variação dos valores das variáveis. Portanto, o valor de a não é mutável. Isso não significa que a não é uma "variável" (no inglês, variable), a documentação oficial chama essa variável de "variável imutável".

Se parte do nosso programa roda sob a hipótese de que um valor nunca mudará, enquanto outra parte do nosso código muda esse valor, a primeira parte do código pode não funcionar conforme o planejado. Por essa razão, erros causados por isso são difíceis de encontrar após o fato. Essa é a razão pela qual o Rust foi projetado com essa mecânica.

Claro, tornar uma variável "mudável" (mutable) requer apenas uma palavra-chave mut.

let mut a = 123;
a = 456;

Este programa está correto.

Diferenças entre Constantes e Variáveis Imutáveis

Se as variáveis imutáveis são imutáveis, não é isso o que chamamos de constante? Por que chamar de variável?

Variáveis e constantes ainda têm diferenças. No Rust, o seguinte programa é válido:

let a = 123;
let a = 456;

Mas se a for uma constante, não é permitido:

const a: i32 = 123;
let a = 456;

Os valores das variáveis podem ser "reatribuídos", mas não podem ser alterados antes da reatribuição, o que garante que o compilador possa inferir logicamente o programa em cada área após a reatribuição. Embora o Rust tenha a função de julgamento automático de tipo, em alguns casos, a declaração de tipo é mais conveniente:

let a: u64 = 123;

Aqui foi declarado a como não assinada 64 Variável de inteiro bit, se não for declarado o tipo, a será automaticamente considerada como assinada 32 Variável de inteiro bit, o que tem um grande impacto no intervalo de valores de a.

Shadowing

O conceito de shadowing é diferente do "override" ou "overload" em outras linguagens orientadas a objetos. Shadowing é o que foi mencionado como "reatribuição", e o uso de aspas foi feito para substituir o conceito sem introduzir o conceito.

Shadowing é o mecanismo de reutilização do nome da variável:

fn main() {
    let x = 5;
    let x = x + 1;
    let x = x * 2;
    println!("O valor de x é: {}", x);
}

O resultado de execução deste programa é:

O valor de x é: 12

O shadowing e a atribuição de variáveis mutáveis não são conceitos idênticos. Shadowing é o uso de um mesmo nome para representar outro objeto de variável, cujo tipo, atributo mutável e valor podem mudar. No entanto, a atribuição de variáveis mutáveis pode apenas ocorrer a mudança de valor.

let mut s = "123";
s = s.len();

Este programa cometerá um erro: não é possível atribuir um valor inteiro a uma variável de string.