Именованные структуры
Как и C и C++, Rust поддерживает пользовательские структуры:
// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0
struct Person {
name: String,
age: u8,
}
fn describe(person: &Person) {
println!("{} is {} years old", person.name, person.age);
}
fn main() {
let mut peter = Person {
name: String::from("Peter"),
age: 27,
};
describe(&peter);
peter.age = 28;
describe(&peter);
let name = String::from("Avery");
let age = 39;
let avery = Person { name, age };
describe(&avery);
}
This slide should take about 10 minutes.
Ключевые моменты:
- Структуры работают так же, как в C или C++.
- Как и в C++, в отличие от C, для определения типа не нужен
typedef. - В отличие от C++, между структурами нет наследования.
- Как и в C++, в отличие от C, для определения типа не нужен
- Сейчас хороший момент сообщить, что существуют разные виды структур.
- Структуры нулевого размера (например,
struct Foo;) могут пригодиться, когда мы реализуем трейт для какого-то типа, но самому значению не нужно хранить никаких данных. - На следующем слайде мы представим кортежные структуры, которые используются, когда имена полей не важны.
- Структуры нулевого размера (например,
- Если у вас уже есть переменные с нужными именами, структуру можно создать с помощью сокращённой записи.
- Поля структур не поддерживают значения по умолчанию. Значения по умолчанию задаются реализацией трейта
Default, о котором мы поговорим позже.
Для дальнейшего изучения
-
Здесь также можно показать синтаксис обновления структуры:
// Copyright 2023 Google LLC // SPDX-License-Identifier: Apache-2.0 let jackie = Person { name: String::from("Jackie"), ..avery }; -
Он позволяет скопировать большую часть полей из старой структуры, не перечисляя их все явно. Он всегда должен быть последним элементом.
-
Чаще всего его используют вместе с трейтом
Default. О синтаксисе обновления структуры подробнее поговорим на слайде о трейтеDefault, поэтому здесь не нужно его обсуждать, если студенты не спросят.