如何在不明确定义项目中的新依赖项的情况下使用来自其他包的箱子?

use*_*932 9 rust

我想使用dijkstra来自pathfinding箱子的功能:

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, 
Run Code Online (Sandbox Code Playgroud)

要使用它,我需要Zeronum_traits箱子中实现特征.但是我该如何导入Zero?一个明显的方法是添加extern crate num_traits;到我的箱子并Cargo.toml适当地修复我.但是在这样做时,我必须观察依赖的依赖性,这是不好的.

我可以以某种方式实现Zero没有明确依赖于 num_traits板条箱,如下所示?

use pathfinding::num_traits::Zero; 
Run Code Online (Sandbox Code Playgroud)

E_n*_*ate 6

鉴于将未公开的依赖项从包(例如pathfinding)导入依赖项目的初衷,目前不允许这样做.如果包不重新导出依赖项,那么它将使其更多地是一个实现细节,而不是API的一部分.因此,允许依赖者访问任何"子依赖"将是灾难性的.

但是,在这种情况下,由于num_traits明确在crate的公共API中使用,因此依赖者也可以访问它.实际上,您需要在自己的项目中添加依赖项,同时注意保持兼容版本.否则,货物最终可能会构建重复的依赖关系.

[dependencies]
num_traits = "0.1"
Run Code Online (Sandbox Code Playgroud)

为了避免这种情况,pathfinding可以从出口中受益num_traits,如下所示.PR#6是为此目的而创建的,并已合并到版本0.1.12(谢谢,@ SamuelTardieu).

pub extern crate num_traits;
Run Code Online (Sandbox Code Playgroud)

完成后,您现在可以完全按照问题末尾所写的内容完成:

use pathfinding::num_traits::Zero;
Run Code Online (Sandbox Code Playgroud)