Реализации методов по умолчанию
// Copyright 2025 Google LLC
// SPDX-License-Identifier: Apache-2.0
pub trait CollectLeaves {
type Leaf;
// Обязательный метод
fn collect_leaves_buffered(&self, buf: &mut Vec<Self::Leaf>);
// Реализация по умолчанию
fn collect_leaves(&self) -> Vec<Self::Leaf> {
let mut buf = vec![];
self.collect_leaves_buffered(&mut buf);
buf
}
}
-
У трейтов часто есть методы, которые уже реализованы за вас, как только вы реализуете обязательные методы.
-
У метода трейта есть реализация по умолчанию, если присутствует тело функции. Эта реализация может быть выражена через другие доступные методы, например через другие методы того же трейта или методы супертрейта.
-
Часто встречаются методы, которые задают основную функциональность (например,
compareуOrd), и методы, которые можно выразить через них, с реализациями по умолчанию (например,max/min/clampуOrd). -
Методы по умолчанию могут быть переопределены макросами derive, так как они порождают произвольные синтаксические деревья в реализации.
Справка:
- https://doc.rust-lang.org/reference/items/traits.html#r-items.traits.associated-item-decls