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

// Нет ограничений трейтов в определении типа.
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, это предпочтительный способ наложить ограничение трейта на параметр типа.

    Мы не помещаем ограничение в само определение типа, потому что это вызвало бы проблемы для всех мест, где тип упоминается с обобщённым параметром.

    С условными реализациями методов инварианты поддерживаются прекрасно.