Это обычная модель!
Если вы хотите добавить методы к типу, который определен в другом ящике, официальный способ сделать это - определить черту и реализовать ее для этого типа. Если тип из другого ящика, то это способ только .
Повсеместным примером этого является ящик itertools
, который использует черту для добавления полезных методов в каждую существующую реализацию std::iter::Iterator
.
Itertools
работает так же, как вы описываете. Существует черта, которая объявляет ряд методов:
pub trait Itertools : Iterator {
fn interleave<J>(self, other: J) -> Interleave<Self, J::IntoIter>
where J: IntoIterator<Item = Self::Item>,
Self: Sized
{
interleave(self, other)
}
// etc...
}
Определено для всех Iterator
с:
impl<T: ?Sized> Itertools for T where T: Iterator { }
И всякий раз, когда вы хотите использовать эти дополнительные методы, вы импортируете его:
use itertools::Itertools;
let it = (1..7).interleave(vec![-1, -2]);
itertools::assert_equal(it, vec![1, -1, 2, -2, 3, 4, 5, 6]);