2017-07-02 6 views
8

Chcę użyć funkcji dijkstra z pathfinding skrzyni:Jak używać skrzyni z innej skrzynki bez jawnego definiowania nowej zależności w moim projekcie?

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

Aby z niej skorzystać trzeba wdrożyć Zero cechę z num_traits skrzyni. Ale jak mogę zaimportować Zero? Oczywistym sposobem jest dodanie do mojej skrzyni extern crate num_traits; i poprawienie odpowiednio mojego Cargo.toml. Ale robiąc to, muszę obserwować zależność zależności, która nie jest dobra.

Czy mogę jakoś wdrożyć Zero bez wyraźnej zależności od skrzyni num_traits, jak poniżej?

use pathfinding::num_traits::Zero; 
+5

Niektóre skrzynie rzeczywiście odsłonić wewnętrzny moduł 'num_traits' publicznie. Być może najlepszą rzeczą do zrobienia jest zaproponowanie tego w repozytorium ścieżek. –

+4

@ E_net4: Program pathfinding w wersji 0.1.12 został zwolniony z proponowaną zmianą. Dzięki. –

Odpowiedz

6

dla pierwotnych intencji importowania nienaświetlone zależności od skrzyni (takie jak pathfinding) do zależnego od projektu, który nie jest obecnie zabronione. Jeśli zależność nie zostanie ponownie wyeksportowana przez skrzynię, to czyni ją bardziej szczegółem implementacji niż częścią API. Umożliwienie osobom zależnym dostępu do dowolnej "zależności" byłoby katastrofalne.

W tym przypadku jednak, ponieważ num_traits jest wyraźnie używany w publicznym interfejsie skrzynki, ma również sens, aby osoba zależna miała do niego dostęp. W tej sytuacji oczekuje się, że dodasz zależność we własnym projekcie, jednocześnie dbając o zachowanie zgodnej wersji. W przeciwnym razie ładunek może skończyć się budową duplikatów zależności.

[dependencies] 
num_traits = "0.1" 

W celu uniknięcia tego, pathfinding skorzystaliby z eksportu własnej num_traits, jak poniżej. PR #6 został stworzony do tego celu i został scalony do wersji 0.1.12 (dzięki, @SamuelTardieu).

pub extern crate num_traits; 

Mając to zrobić, można zrobić dokładnie tak, jak napisane na końcu pytanie:

use pathfinding::num_traits::Zero; 
Powiązane problemy