Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Кортежи

Если имена полей не важны, можно использовать кортежную структуру:

// 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 в целом избегает неявных преобразований, например автоматической распаковки или использования булевых значений как целых.
  • Если у кортежной структуры нет полей, () можно опустить. Результатом будет тип нулевого размера (ZST), у которого есть ровно одно значение (имя типа).
    • Это распространено для типов, которые реализуют некоторое поведение, но не содержат данных (представьте NullReader, который реализует поведение читателя, всегда возвращая EOF).
  • Этот пример — тонкая отсылка к аварии Mars Climate Orbiter.