Кортежи
Если имена полей не важны, можно использовать кортежную структуру:
// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0
struct Point(i32, i32);
fn main() {
let p = Point(17, 23);
println!("({}, {})", p.0, p.1);
}
Так часто делают обёртки над одним полем (их называют newtype):
// Copyright 2023 Google LLC
// SPDX-License-Identifier: Apache-2.0
struct PoundsOfForce(f64);
struct Newtons(f64);
fn compute_thruster_force() -> PoundsOfForce {
todo!("Ask a rocket scientist at NASA")
}
fn set_thruster_force(force: Newtons) {
// ...
}
fn main() {
let force = compute_thruster_force();
set_thruster_force(force);
}
This slide should take about 10 minutes.
- Newtype — отличный способ закодировать дополнительную информацию о значении примитивного типа, например:
- Число измеряется в каких-то единицах: в примере выше это
Newtons. - Значение прошло проверку при создании, поэтому больше не нужно проверять его при каждом использовании:
PhoneNumber(String)илиOddNumber(u32).
- Число измеряется в каких-то единицах: в примере выше это
- Паттерн newtype подробно рассматривается в модуле «Идиоматичный Rust».
- Покажите, как прибавить значение
f64к типуNewtons, обратившись к единственному полю newtype.- Rust в целом избегает неявных преобразований, например автоматической распаковки или использования булевых значений как целых.
- Перегрузка операторов рассматривается во второй день (Стандартные трейты библиотеки).
- Rust в целом избегает неявных преобразований, например автоматической распаковки или использования булевых значений как целых.
- Если у кортежной структуры нет полей,
()можно опустить. Результатом будет тип нулевого размера (ZST), у которого есть ровно одно значение (имя типа).- Это распространено для типов, которые реализуют некоторое поведение, но не содержат данных (представьте
NullReader, который реализует поведение читателя, всегда возвращая EOF).
- Это распространено для типов, которые реализуют некоторое поведение, но не содержат данных (представьте
- Этот пример — тонкая отсылка к аварии Mars Climate Orbiter.