Tipos de Dados em Rust

Tipos de Dados em Rust

Os valores dos dados que são processados e armazenados, no Rust, são classificados em um determinado tipo de dados, de modo que o Rust saiba como lidar com cada dado em particular.

O Rust é uma linguagem de tipagem estática, o que significa que ela precisa saber os tipos de todas as variáveis em tempo de compilação.

Os tipos de dados em Rust são divididos em duas grandes categorias: Tipos Escalares e Tipos Compostos. Neste tutorial vamos nos focar nos tipos escalares em Rust, e no próximo, estudaremos os tipos compostos.

Tipos Escalares em Rust

Um tipo escalar representa um valor único. A linguagem Rust possui suporte a quatro tipos escalares primários, que são:

  • Tipo Inteiro
  • Ponto-Flutuante
  • Booleano (Lógico)
  • Caracteres

Vamos estudar cada tipo separadamente.

Tipo Inteiro em Rust

Se refere a números sem uma parte decimal (fracionária). Os principais tipos inteiros em Rust são:

Tabela 1.1: Tipos Inteiros em Rust

Comprimento Com Sinal Sem Sinal
8 bits i8 u8
16 bits i16 u16
32 bits i32 u32
64 bits i64 u64
128 bits i128 u128

Com sinal e sem sinal indicam se o número pode ser negativo (com ou sem sinal de negativo: -).

Cada tipo com sinal pode armazenar números de -(2n – 1) a 2n – 1 – 1 inclusive, onde n é o número de bits que o tipo em particular usa. Assim, um inteiro do tipo i8 pode armazenar números de -(27) até 27 – 1, que equivale à faixa numérica de -128 a 127.

Já tipos sem sinal podem armazenar números de 0 a 2n – 1 (ou seja, somente positivos), e assim um tipo inteiro u8 consegue armazenar números de 0 a 28 – 1, que é a faixa de 0 a 255.

O tipo inteiro padrão em Rust é o i32, que significa que se o tipo não for explicitamente declarado, será assumido um número inteiro com sinal (i), que pode representar valores positivos e negativos, ocupando um espaço de 32 bits na memória RAM.

Chamamos de Inferência de Tipo quando um tipo não é explicitamente declarado.

Exemplo:

fn main() {
  let a = 90;
  let g: u32 = 100;
  let x: i32 = -250;
  println!("Tipo Inteiro com sinal: {}", a);
  println!("Outro dado inteiro, sem sinal: {}", g);
  println!("Mais um inteiro com sinal, declarado explicitamente: {}", x);
}

Tipo de Ponto Flutuante em Rust

Tipos de ponto flutuante são aqueles que representam as casas decimais – são os números quebrados, coloquialmente.

Em Rust os tipos de ponto flutuante são f32 e f64, de tamanhos 32 e 64 bits, respectivamente. O padrão é o tipo f64, e ambos os tipos possuem sinal.

O tipo f32 é de precisão simples (“float“), e o tipo f64, de precisão dupla (“double“).

Exemplo:

fn main() {
  let b: f32 = 6.000001; // se houver mais um zero na parte decimal, o valor será exibido incorretamente
  let d: f64 = 6.0000000001; // exibe o valor normalmente
  println!("{}", b);
  println!("{}", d);
}

Tipo Booleano

Um tipo booleano é um tipo lógico, que suporta apenas dois valores possíveis: true e false (verdadeiro e falso). Este tipo possui tamanho de um byte, e é declarado com a palavra-chave bool.

São empregados comumente em estruturas de decisão e laços de repetição, onde uma condição deve ser avaliada para decidir o que o programa fará na sequência.

Exemplo:

fn main() {
  let V: bool = true;
  let F: bool = false;
  println!("{}", V);
  println!("{}", F);
}

Tipo de Caractere

O tipo padrão para armazenamento de caracteres em Rust é o tipo char. Este tipo, cujos dados são representados entre aspas simples, ocupa quatro bytes por dado e representa um valor escalar Unicode. Sendo assim, consegue representar caracteres ASCII, símbolos e caracteres especiais, caracteres em idiomas orientais (Chinês, Japonês, Coreano, etc.), emojis e muitos outros.

Exemplo:

fn main() {
  let c: char = 'Q';
  println!("{}", c);
}

Note que o tipo char é empregado para o armazenamento de um caractere único. Sendo assim, a declaração a seguir está incorreta, e irá gerar um erro ao compilarmos:

fn main() {
  let c: char = 'Morango';
  println!("{}", c);
}

Como declaramos um tipo para representar mais de um caractere então? Para isso necessitamos de um tipo para armazenamento de strings.

Strings em Rust

Uma string é uma cadeia de caracteres, que empregamos para armazenar dados comuns como nomes, palavras, códigos, descrições, etc.

Em Rust, existe um tipo string, com suporte a UTF-8.

Para criarmos um dado do tipo string, devemos representar seu valor entre aspas duplas, como no exemplo a seguir:

fn main() {
  let nome = "Fábio dos Reis";
  println!("{}", nome);
}

Neste exemplo, “Fábio dos Reis” é um literal de string e o tipo é &’static str. Um literal de string é uma fatia de string alocada de forma estática, o que significa que ela fica armazenada dentro do programa compilado, existindo enquanto o programa estiver em execução.

Em Rust, existe um outro tipo para armazenamento de Strings. Trata-se do tipo String, cujo tamanho pode crescer dinamicamente. É possível criar objetos do tipo String convertendo uma fatia de string com o método to_string().

Confuso? Não se preocupe. Teremos um tutorial especial dedicado às strings em Rust. Por enquanto, basta declarar os dados do tipo string envolvendo-os em aspas duplas ao declarar uma variável, como no exemplo a seguir:

fn main() {
 let canal = "Bóson Treinamentos em Tecnologia!";
 println!("{}", canal);
}

Nas próximas lições vamos dar uma olhada em alguns tipos compostos em Rust, além de aprender a realizar a conversão de um tipo em outro (casting de tipos).

Perguntas e Respostas comuns

O que é um Tipo de Dado em programação?
Tipo de dado é uma classificação que especifica qual tipo de valor uma variável pode armazenar, e que tipos de operações matemáticas, relacionais ou lógicas podem ser aplicadas a essa variável, sem causar erros.

Quais são os tipos escalares em Rust?
Os tipos escalares em Rust são o tipo inteiro, de ponto flutuante , booleano e de caracteres.

O que significa tipo com sinal e tipo sem sinal?
Tipo com sinal indica que o número pode ser negativo (com sinal ), e tipo sem sinal, que o número somente pode ser positivo.

Referências

Sobre Fábio dos Reis (1230 Artigos)
Fábio dos Reis trabalha com tecnologias variadas há mais de 30 anos, tendo atuado nos campos de Eletrônica, Telecomunicações, Programação de Computadores e Redes de Dados. É um entusiasta de Ciência e Tecnologia em geral, adora Viagens e Música, e estuda idiomas, além de ministrar cursos e palestras sobre diversas tecnologias em São Paulo e outras cidades do Brasil.

Escreva um comentário

Seu e-mail não será divulgado


*