Условные реализации методов
// Copyright 2025 Google LLC
// SPDX-License-Identifier: Apache-2.0
// Нет ограничений трейтов в определении типа.
pub struct Value<T>(T);
// Вместо этого ограничения накладываются на реализации для типа.
impl<T: std::fmt::Display> Value<T> {
fn log(&self) {
println!("{}", self.0);
}
}
// или так
impl<T> Value<T> {
// Задаёт ограничение трейта в выражении where
fn log_error(&self)
where
T: std::error::Error,
{
eprintln!("{}", self.0);
}
}
-
Определяя тип с обобщёнными параметрами, мы можем писать реализации для этого типа, которые зависят от того, какими являются параметры или какие трейты они реализуют.
-
Такие методы доступны только тогда, когда тип удовлетворяет этим условиям.
-
Для таких вещей, как упорядоченные множества, где внутренний тип должен всегда реализовывать
Ord, это предпочтительный способ наложить ограничение трейта на параметр типа.Мы не помещаем ограничение в само определение типа, потому что это вызвало бы проблемы для всех мест, где тип упоминается с обобщённым параметром.
С условными реализациями методов инварианты поддерживаются прекрасно.