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 2025 Google LLC
// SPDX-License-Identifier: Apache-2.0

#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
struct BufferId([u8; 16]);

#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
struct DrawingBuffer {
    target: [u8; 16],
    commands: Vec<String>,
}
  • Многие трейты, протоколы и интерфейсы имеют тривиальные реализации, которые легко написать механически.

  • Определения типов (их синтаксические деревья) можно передать процедурным макросам (плагинам компилятора), чтобы автоматически сгенерировать реализации трейтов.

    Эти макросы кто-то должен написать: компилятор не может всё понять самостоятельно.

  • У многих трейтов есть наивная, очевидная реализация — как правило, та, что опирается на то, что все поля или варианты уже реализуют трейт.

    PartialEq/Eq достаточно легко вывести (derive) для типов, у которых все поля или варианты реализуют эти трейты: сопоставляем поля или варианты, и если хотя бы одно не совпадает, проверка на равенство возвращает false.

  • Derive позволяют механически и предсказуемо избавиться от шаблонного кода. Авторы реализации derive, вероятно, создавали трейт, имея в виду правильную семантику трейта.

  • Спросите класс: приходилось ли слушателям работать с кодовой базой, где бо́льшая часть кода была тривиальным шаблонным кодом?

  • Это похоже на систему deriving в Haskell.

Справка:

  • https://doc.rust-lang.org/reference/attributes/derive.html#r-attributes.derive