我想使用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;
答案 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;