Explorando os Tipos de Structs e Aplicações em Rust

Beginner

This tutorial is from open-source community. Access the source code

Introdução

Neste laboratório, exploraremos estruturas na linguagem de programação Rust. Existem três tipos de estruturas ("structs") que podem ser criadas usando a palavra-chave struct: tuple structs, classic C structs e unit structs. Tuple structs são essencialmente tuplas nomeadas, C structs são as structs tradicionais encontradas na programação C, e unit structs não possuem campos e são úteis para genéricos. Podemos definir structs com múltiplos campos, como Person, que possui os campos name e age. Structs também podem ser reutilizadas como campos de outra struct, como mostrado no exemplo de um Rectangle, que consiste em duas structs Point representando os cantos superior esquerdo e inferior direito. Podemos inicializar structs usando a abreviação de inicialização de campo (field init shorthand) e acessar seus campos usando a notação de ponto. Também é possível desestruturar structs usando a ligação let. Adicionalmente, o laboratório fornece duas atividades - criar uma função rect_area para calcular a área de um Rectangle usando desestruturação aninhada, e criar uma função square que recebe um Point e um f32 como argumentos e retorna um Rectangle com seu canto superior esquerdo no ponto e uma largura e altura correspondentes ao f32.

Nota: Se o laboratório não especificar um nome de arquivo, você pode usar qualquer nome de arquivo que desejar. Por exemplo, você pode usar main.rs, compilar e executá-lo com rustc main.rs && ./main.

Estruturas

Existem três tipos de estruturas ("structs") que podem ser criadas usando a palavra-chave struct:

  • Tuple structs, que são, basicamente, tuplas nomeadas.
  • As classic C structs
  • Unit structs, que não possuem campos, são úteis para genéricos.
// Um atributo para esconder avisos de código não utilizado.
#![allow(dead_code)]

#[derive(Debug)]
struct Person {
    name: String,
    age: u8,
}

// Uma unit struct
struct Unit;

// Uma tuple struct
struct Pair(i32, f32);

// Uma struct com dois campos
struct Point {
    x: f32,
    y: f32,
}

// Structs podem ser reutilizadas como campos de outra struct
struct Rectangle {
    // Um retângulo pode ser especificado por onde os cantos superior esquerdo e inferior direito
    // estão no espaço.
    top_left: Point,
    bottom_right: Point,
}

fn main() {
    // Cria struct com field init shorthand
    let name = String::from("Peter");
    let age = 27;
    let peter = Person { name, age };

    // Imprime struct de debug
    println!("{:?}", peter);

    // Instancia um `Point`
    let point: Point = Point { x: 10.3, y: 0.4 };

    // Acessa os campos do ponto
    println!("point coordinates: ({}, {})", point.x, point.y);

    // Cria um novo ponto usando a sintaxe de atualização de struct para usar os campos do nosso
    // outro
    let bottom_right = Point { x: 5.2, ..point };

    // `bottom_right.y` será o mesmo que `point.y` porque usamos esse campo
    // de `point`
    println!("second point: ({}, {})", bottom_right.x, bottom_right.y);

    // Desestrutura o ponto usando uma ligação `let`
    let Point { x: left_edge, y: top_edge } = point;

    let _rectangle = Rectangle {
        // a instanciação de struct também é uma expressão
        top_left: Point { x: left_edge, y: top_edge },
        bottom_right: bottom_right,
    };

    // Instancia uma unit struct
    let _unit = Unit;

    // Instancia uma tuple struct
    let pair = Pair(1, 0.1);

    // Acessa os campos de uma tuple struct
    println!("pair contains {:?} and {:?}", pair.0, pair.1);

    // Desestrutura uma tuple struct
    let Pair(integer, decimal) = pair;

    println!("pair contains {:?} and {:?}", integer, decimal);
}

Atividade

  1. Adicione uma função rect_area que calcula a área de um Rectangle (tente usar desestruturação aninhada).
  2. Adicione uma função square que recebe um Point e um f32 como argumentos e retorna um Rectangle com seu canto superior esquerdo no ponto e uma largura e altura correspondentes ao f32.

Resumo

Parabéns! Você concluiu o laboratório de Estruturas. Você pode praticar mais laboratórios no LabEx para aprimorar suas habilidades.