Изучение типов и применений структур в Rust

Beginner

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

Введение

В этом лабораторном задании мы будем изучать структуры в языке программирования Rust. Существует три типа структур ("struct"), которые можно создать с использованием ключевого слова struct: кортежные структуры, классические C-структуры и структуры-одиницы. Кортежные структуры по сути представляют собой именованные кортежи, C-структуры - это традиционные структуры, найденные в C-программировании, а структуры-одиницы не имеют полей и полезны для обобщений. Мы можем определить структуры с несколькими полями, например, Person, которая имеет поля name и age. Структуры также можно повторно использовать в качестве полей другой структуры, как показано в примере Rectangle, который состоит из двух структур Point, представляющих верхний левый и нижний правый углы. Мы можем инициализировать структуры с использованием сокращенной записи инициализации полей и обращаться к их полям с использованием точки. Также можно деструктурировать структуры с использованием связывания let. Кроме того, в лабораторном задании представлены два задания: создание функции rect_area для вычисления площади Rectangle с использованием вложенной деструктуризации и создание функции square, которая принимает Point и f32 в качестве аргументов и возвращает Rectangle с верхним левым углом в данной точке и шириной и высотой, соответствующими f32.

Примечание: Если лабораторное задание не задает имя файла, вы можете использовать любое имя файла, которое хотите. Например, вы можете использовать main.rs, скомпилировать и запустить его с помощью rustc main.rs &&./main.

Структуры

Существует три типа структур ("struct"), которые можно создать с использованием ключевого слова struct:

  • Кортежные структуры, которые по сути представляют собой именованные кортежи.
  • Классические C-структуры
  • Структуры-одиницы, которые не имеют полей и полезны для обобщений.
// Аттрибут для скрытия предупреждений о неиспользуемом коде.
#![allow(dead_code)]

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

// Структура-одиница
struct Unit;

// Кортежная структура
struct Pair(i32, f32);

// Структура с двумя полями
struct Point {
    x: f32,
    y: f32,
}

// Структуры можно повторно использовать в качестве полей другой структуры
struct Rectangle {
    // Прямоугольник можно определить по координатам верхнего левого и нижнего правого углов.
    top_left: Point,
    bottom_right: Point,
}

fn main() {
    // Создать структуру с использованием сокращенной записи инициализации полей
    let name = String::from("Peter");
    let age = 27;
    let peter = Person { name, age };

    // Вывести отладочную информацию о структуре
    println!("{:?}", peter);

    // Создать экземпляр `Point`
    let point: Point = Point { x: 10.3, y: 0.4 };

    // Доступ к полям точки
    println!("координаты точки: ({}, {})", point.x, point.y);

    // Создать новую точку с использованием синтаксиса обновления структуры, чтобы использовать поля другой точки
    let bottom_right = Point { x: 5.2,..point };

    // `bottom_right.y` будет таким же, как `point.y`, потому что мы использовали это поле из `point`
    println!("вторая точка: ({}, {})", bottom_right.x, bottom_right.y);

    // Деструктурировать точку с использованием связывания `let`
    let Point { x: left_edge, y: top_edge } = point;

    let _rectangle = Rectangle {
        // Инициализация структуры также является выражением
        top_left: Point { x: left_edge, y: top_edge },
        bottom_right: bottom_right,
    };

    // Создать экземпляр структуры-одиницы
    let _unit = Unit;

    // Создать экземпляр кортежной структуры
    let pair = Pair(1, 0.1);

    // Доступ к полям кортежной структуры
    println!("пара содержит {:?} и {:?}", pair.0, pair.1);

    // Деструктурировать кортежную структуру
    let Pair(integer, decimal) = pair;

    println!("пара содержит {:?} и {:?}", integer, decimal);
}

Задание

  1. Добавить функцию rect_area, которая вычисляет площадь Rectangle (попробуйте использовать вложенную деструктуризацию).
  2. Добавить функцию square, которая принимает Point и f32 в качестве аргументов и возвращает Rectangle с верхним левым углом в данной точке и шириной и высотой, соответствующими f32.

Резюме

Поздравляем! Вы завершили лабораторную работу по структурам. Вы можете практиковаться в других лабораторных работах в LabEx, чтобы улучшить свои навыки.