Введение
В этом лабораторном задании мы будем изучать структуры в языке программирования 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);
}
Задание
- Добавить функцию
rect_area, которая вычисляет площадьRectangle(попробуйте использовать вложенную деструктуризацию). - Добавить функцию
square, которая принимаетPointиf32в качестве аргументов и возвращаетRectangleс верхним левым углом в данной точке и шириной и высотой, соответствующимиf32.
Резюме
Поздравляем! Вы завершили лабораторную работу по структурам. Вы можете практиковаться в других лабораторных работах в LabEx, чтобы улучшить свои навыки.