Как мне использовать ящик из другого ящика без явного определения новой зависимости в моем проекте?

#rust #rust-cargo

Вопрос:

Я хочу использовать dijkstra функцию из pathfinding ящика:

 pub fn dijkstra<N, C, FN, IN, FS>(
    start: amp;N, 
    neighbours: FN, 
    success: FS
) -> Option<(Vec<N>, C)> 
where
    N: Eq   Hash   Clone,
    C: Zero   Ord   Copy,
    FN: Fn(amp;N) -> IN,
    IN: IntoIterator<Item = (N, C)>,
    FS: Fn(amp;N) -> bool, 
 

Чтобы использовать его, мне нужно реализовать Zero признак из num_traits ящика. Но как я могу импортировать Zero ? Очевидный способ — добавить extern crate num_traits; в мой ящик и исправить Cargo.toml его соответствующим образом. Но при этом мне приходится наблюдать зависимость зависимости, что нехорошо.

Могу ли я как-то реализовать Zero без явной зависимости от num_traits ящика, как показано ниже?

 use pathfinding::num_traits::Zero; 
 

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

1. Некоторые ящики действительно предоставляют внутренний num_traits модуль публично. Возможно, лучшее, что можно сделать здесь, — предложить это в репозитории поиска путей.

2. @E_net4: поиск пути 0.1.12 выпущен с предлагаемым вами изменением. Спасибо.

Ответ №1:

Учитывая первоначальное намерение импортировать незащищенные зависимости из ящика (например, pathfinding ) в зависимый проект, в настоящее время это запрещено. Если зависимость не экспортируется повторно ящиком, это делает ее скорее деталью реализации, чем частью API. Поэтому разрешение зависимому пользователю доступа к любой «зависимости» было бы катастрофическим.

Однако в этом случае, поскольку num_traits он явно используется в общедоступном API ящика, также имеет смысл, чтобы зависимый имел к нему доступ. Как бы то ни было, ожидается, что вы добавите зависимость в свой собственный проект, сохраняя при этом совместимую версию. В противном случае cargo может привести к созданию повторяющихся зависимостей.

 [dependencies]
num_traits = "0.1"
 

Чтобы избежать этого, pathfinding было бы полезно экспортировать свой собственный num_traits , как показано ниже. Для этой цели был создан PR # 6, который был объединен в версию 0.1.12 (спасибо, @SamuelTardieu).

 pub extern crate num_traits;
 

Сделав это, теперь вы можете сделать точно так, как написано в конце вашего вопроса:

 use pathfinding::num_traits::Zero;