Pular para o conteúdo principal
Módulo 4 · Lição 1 de 27/14 no curso~12 min
Lições do módulo (1/2)

Definindo e instanciando estruturas

Estruturas (ou estruturas) em Rust são tipos de dados personalizados que permitem agrupar vários valores relacionados. Eles são semelhantes a objetos ou classes de outras linguagens, mas sem herança.

Definindo uma estrutura

Para definir uma estrutura, usamos a palavra-chave struct seguida do nome em PascalCase. Dentro, definimos os nomes e tipos dos campos:

Rust
struct User {
    username: String,
    email: String,
    active: bool,
    sign_in_count: u64,
}

Criando uma instância

Para usar uma struct, devemos criar uma instância preenchendo todos os campos especificados:

Rust
fn main() {
    let user1 = User {
        email: String::from("alice@example.com"),
        username: String::from("alice123"),
        active: true,
        sign_in_count: 1,
    };

    // Access fields using dot notation
    println!("Is user {} active? {}", user1.username, user1.active);
}

Mutabilidade estrutural

No Rust, toda a instância deve ser marcada como mutável (mut) se você quiser modificar algum de seus campos. Rust não permite marcar apenas alguns campos como mutáveis:

Rust
fn main() {
    let mut user1 = User {
        email: String::from("alice@example.com"),
        username: String::from("alice123"),
        active: true,
        sign_in_count: 1,
    };

    user1.active = false; // Valid because user1 is mutable!
}

Estruturas de tupla e estruturas semelhantes a unidades

Rust também oferece suporte a dois outros formatos de estrutura além das estruturas clássicas de campo nomeado:

  1. Estruturas de Tupla: Possuem um nome associado mas os campos não possuem nomes individuais, apenas tipos. Eles são úteis para definir e diferenciar tipos específicos:
    Rust
    struct Point(i32, i32, i32);
    let origin = Point(0, 0, 0);
  2. Estruturas semelhantes a unidades: Elas não definem nenhum campo. Eles se comportam como o tipo de unidade (). Eles são úteis quando você precisa implementar comportamentos (traços) em um tipo sem armazenar nenhum dado nele.

Experimente você mesmo

Exercício#rust.m4.l1.e1
Tentativas: 0Carregando…

Defina a estrutura User acima de main com os campos: nome de usuário (tipo String) e ativo (tipo bool).

Carregando editor…
Mostrar dica

Escreva `struct User { nome de usuário: String, ativo: bool }`before`main`.

Solução disponível após 3 tentativas

Exercício#rust.m4.l1.e2
Tentativas: 0Carregando…

Modifique user1 para torná-lo mutável (deixe mut user1) e altere o campo ativo para false antes de imprimir.

Carregando editor…
Mostrar dica

Adicione `mut`to`let user1`para torná-lo`let mut user1`e insira`user1.active = false;`.

Solução disponível após 3 tentativas

Exercício#rust.m4.l1.e3
Tentativas: 0Carregando…

Defina uma estrutura de tupla chamada Color contendo três campos i32. Principalmente, instancie Color com os valores 255, 0 e 100 atribuindo-o à variável my_color, depois imprima seu primeiro elemento (valor vermelho) usando println!.

Carregando editor…
Mostrar dica

Defina a estrutura da tupla com `struct Color(i32, i32, i32);`. Basicamente, instancie-o como `let my_color = Color(255, 0, 100);`e imprima o valor vermelho com`my_color.0`.

Solução disponível após 3 tentativas