Как взять существующую структуру данных (vec, hashmap, set) и расширить ее методы с помощью внешней библиотеки?
fn main() {
let vec = vec![1, 2, 3];
vec.my_new_method(...)
}
Вы можете воспользоваться тем фактом, что крейт, определяющий трейт, может реализовать этот трейт в любом желаемом типе. Вот простой пример комбинированной функции «сдвинуть, а затем нажать». Сначала он сдвинет первый элемент из вектора (если он есть), а затем переместит аргумент в конец вектора. Если был смещенный элемент, он возвращается. (Это немного глупая операция, но она работает, чтобы продемонстрировать эту технику.)
Сначала мы объявляем трейт с сигнатурой методов, которые мы хотим добавить:
trait VecExt<T> {
fn shift_and_push(&mut self, v: T) -> Option<T>;
}
Теперь мы можем реализовать трейт для Vec<T>
:
impl<T> VecExt<T> for Vec<T> {
fn shift_and_push(&mut self, v: T) -> Option<T> {
let r = if !self.is_empty() { Some(self.remove(0)) } else { None };
self.push(v);
r
}
}
Теперь везде, где VecExt
входит в область действия с use
(или находится в том же исходном файле, что и его объявление), этот метод расширения можно использовать для любого вектора.
@Test Любой use
, который вводит его в область действия, будет работать, независимо от того, называете ли вы его явно или выполняете импорт с подстановочными знаками всего в модуле, частью которого он является.
Не могли бы вы уточнить, какие вызовы необходимы? Например, всегда ли необходимо «использовать», например «использовать mypackage::mymodule::*». Я знаю, что иногда могу напрямую ссылаться на "mypackage::mymodule::VecExt".