Производные трейты
// 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