如何在不明确定义新的依赖项的情况下,使用来自另一个crate的crate?

11

我想使用 dijkstra 函数来自 pathfinding crate:

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 trait。但是,我如何导入 Zero?一个明显的方法是将 extern crate num_traits; 添加到我的创建并适当修复我的 Cargo.toml。但这样做,我必须关注依赖项的依赖项,这是不好的。

我能否以没有显式依赖于num_traits创建的方式来实现Zero呢?

use pathfinding::num_traits::Zero; 

6
确实有一些箱子公开地暴露了内部的num_traits模块。在这里最好的做法可能是在路径规划存储库中提出这个建议。 - E net4
5
pathfinding 0.1.12已发布,其中包含您提议的更改。感谢您的贡献。 - Samuel Tardieu
1个回答

7

原本从一个板条箱中导入非公开依赖项(如pathfinding)到一个依赖项目中,这是不允许的。如果一个依赖项没有被重新导出,这使它更像是实现细节而不是API的一部分。因此,允许一个依赖项访问任何"子依赖项"将会是灾难性的。

然而,在这种情况下,由于num_traits显然在板条箱的公共API中使用,因此对于依赖方来说,访问它也是有意义的。因此,你应该在你自己的项目中添加这个依赖项,并确保保持兼容的版本。否则,货物可能会建立重复的依赖关系。

[dependencies]
num_traits = "0.1"

为了避免这种情况,pathfinding 可以从下面开始受益于导出自己的 num_traits。 为此目的创建了 PR #6 ,已合并到版本0.1.12中(感谢@SamuelTardieu)。
pub extern crate num_traits;

完成这一步之后,你现在可以按照你问题结尾所写的那样去做了。
use pathfinding::num_traits::Zero;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接