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

时间:2017-07-02 23:42:24

标签: rust

我想使用pathfinding包中的dijkstra函数:

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, 

要使用它,我需要从num_traits包中实现Zero特征。但是如何导入Zero?一种显而易见的方法是将extern crate num_traits;添加到我的包中并适当地修复我的Cargo.toml。但是这样做,我必须观察依赖的依赖性,这是不好的。

我可以以某种方式实现Zero而不明确依赖num_traits包,如下所示?

use pathfinding::num_traits::Zero; 

1 个答案:

答案 0 :(得分:6)

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

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

[dependencies]
num_traits = "0.1"

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

pub extern crate num_traits;

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

use pathfinding::num_traits::Zero;