#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;