#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 {}