Связанный элемент RFC сообщает:
Параметры типа для признаков могут быть «входами» или «выходами»:
Входы.Параметр типа «input» используется для определения того, какой импл использовать.
Выходы.Параметр типа «output» однозначно определяется impl, но не играет роли при выборе impl.
RFC также уточняет сопоставление признаков:
- Обработка всех параметров типов черт как типов ввода и
- Предоставление связанных типов, которые являются типами вывода.
Из этих описаний ясночто связанный тип по замыслу контролируется impl
, поэтому невозможно заблокировать разработчикам перезапись типа.
Обходной путь для получения некоторой формы контроля над разработчиком может состоять в определенииметод по умолчанию, использующий связанный тип, например:
pub trait Map: Index<<Self as Map>::Key> {
type Key;
type Value = <Self as Index<<Self as Map>::Key>>::Output;
#[doc(hidden)]
fn invalid_operation() -> Option<&'static <Self as Index<<Self as Map>::Key>>::Output> {
None
}
}
Теперь для разработчиков больше невозможно просто переопределить тип Value
по умолчанию, поскольку метод по умолчанию invalid_operation
больше не проверяет тип.
Обратите внимание также на функцию doc(hidden)
, которая удаляет метод по умолчанию из документов.
Имя скрытого метода может быть выбрано для передачи некоторой информации.ион.Для приведенного выше примера разработчик получает сообщение об ошибке:
error[E0399]: the following trait items need to be reimplemented as `Value` was overridden: `invalid_operation`
Как вы уже знаете, назначение связанных типов по умолчанию недопустимо в текущей стабильной версии Rust, должна использоваться ночная версия и функция должна бытьвключается с:
#![feature(associated_type_defaults)]