RBF*_*F06 4 dependencies traits rust transitive-dependency semantic-versioning
如何在我的应用程序中使用传递依赖项箱中的特征?
这是我遇到的问题的一个最小说明示例:
在 中Cargo.toml,我有:
[dependencies]
mersenne_twister = "1.1.1"
rand = "0.8.5"
Run Code Online (Sandbox Code Playgroud)
我的箱子取决于rand ^0.8.5和mersenne_twister ^1.1.1,它本身取决于rand >=0.3, <0.5:
my-crate ---> rand 0.8.5
|
|
---> mersenne_twister 1.1.1 ----> rand >= 0.3, < 0.5
Run Code Online (Sandbox Code Playgroud)
在我的应用程序中,我想使用trait rand::Rng for mersenne_twister::MT19937. 但是当我尝试将这个特征纳入范围时,它显然没有被识别:
my-crate ---> rand 0.8.5
|
|
---> mersenne_twister 1.1.1 ----> rand >= 0.3, < 0.5
Run Code Online (Sandbox Code Playgroud)
我的猜测是,Rng导入的特征use rand::Rng;是来自 的特征rand 0.8.5,而不是实际实现的特征rand 0.4.6MT19937,即使它们的拼写方式相同,但它们是不同且不相关的特征,因此不能互换引用。
所以我有一些问题:
Rng适用的特征MT19937?我不认为我可以降低对 in 的依赖,rand因为0.4.6我Cargo.toml需要rand 0.8.5在我的应用程序中使用 elsewere。mersenne_twister不重新导出的 API 设计是不好的做法吗Rng?您可以通过重命名其中一个来将依赖项的多个不兼容版本添加到 Cargo.toml。
[dependencies]
mersenne_twister = "1.1.1"
rand = "0.8.5"
old_rand = { package = "rand", version = "0.4.6" }
Run Code Online (Sandbox Code Playgroud)
但对于这种情况,已经有更好的解决方案:使用MT19937 crate,它依赖于最新版本的rand_core。RNG 实现应该依赖于 rand_core 而不是 rand,因为它们需要的只是特征Rng,而不是 rand 中的任何额外内容,例如分布。
我认为我无法在 Cargo.toml 中将对 rand 的依赖降级到 0.4.6,因为我需要在我的应用程序中使用其他的 rand 0.8.5。
您可以通过重命名一个或两个版本来使用两者。
[dependencies]
rand4 = { package = "rand", version = "0.4.6" }
rand8 = { package = "rand", version = "0.8.5" }
Run Code Online (Sandbox Code Playgroud)
然后您可以根据需要在代码中引用rand4::Rng或。rand8::Rng
一般来说,应该如何使用传递依赖中定义的特征?
mersenne_twister不重新导出的 API 设计是不好的做法吗Rng?
重新导出很方便并且经常被推荐,但无论他们是否这样做,停止实现已经实现的任何版本都将是一个 semver 破坏性更改mersenne_twister,因此您rand::Rng不必rand担心代码破坏。
| 归档时间: |
|
| 查看次数: |
74 次 |
| 最近记录: |