Добавьте признак для расширения встроенных типов

#rust

Вопрос:

Я пытаюсь расширить свойство итератора с помощью пользовательской функции:

 pub trait CustomTrait<T> : Iterator<Item=T> where Self: Sized, Self: 'static {
    #[inline]
    fn custom_function(self) -> Result<Box<dyn Iterator>, Err> {
        let boxed = Box::new(self);
        do_something(boxed)
    }
}
 

Он правильно компилируется. Однако, когда я начинаю вызывать свою новую черту на итераторе, компилятор жалуется, что она не реализована для итератора. (Я пробовал std::ops::Range и std::slice::Iter<'_, {integer}> .)

Я смог заставить каждый вызов функции работать для отдельных типов структур с помощью таких строк, как показано ниже:

 impl CustomTrait<u64> for std::ops::Range<u64> {}
 

Тем не менее, я предполагаю, что должен быть способ, которым я могу заставить свое определение признака применяться ко всем итерациям без необходимости вручную реализовывать его для каждой структуры, реализующей итеративный признак.

Ответ №1:

Когда вы расширяете признак, вы в основном создаете новый признак, который также гарантирует, что у него есть все методы, определенные чертой, которую он расширяет.

Чего он не делает, так это автоматически реализует любой из этих методов для расширяемой вами характеристики.

В дополнение к тому, что вы уже сделали, вам действительно нужно реализовать свою черту для итератора:

 impl<T> CustomTrait<T> for Iterator<Item=T> {
  ...
}
 

Комментарии:

1. Нет, я этого не делал, спасибо! Для дальнейшего использования в моем случае мне пришлось немного адаптировать его из-за того, что часть кода, который я не показывал, вызывала ошибку компиляции вокруг итератора с динамическим размером: impl<T, V> CustomTrait<V> for T where T : Iterator<Item=V>, T: 'static {}