如何在我的应用程序中使用可传递依赖项框中的特征?

以下是我遇到的问题的一个最小说明性示例:

Cargo.toml年里,我有:

[dependencies]
mersenne_twister = "1.1.1"
rand = "0.8.5"

我的 crate 取决于rand ^0.8.5mersenne_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

在我的应用程序中,我想使用trait rand::Rng for mersenne_twister::MT19937的实现.但是当我try 将这个特性纳入范围时,它显然没有被识别出来:

use mersenne_twister::MT19937;
use rand::Rng;

fn main() {
    let mut rng = MT19937::new_unseeded();
    let mut buffer = vec![0; 0xFFFF];

    // error[E0599]: no method named `fill_bytes` found for struct `MT19937` in the current scope
    rng.fill_bytes(&mut buffer);
}

我的猜测是,use rand::Rng;导入的Rng特征是one from rand 0.8.5,而不是MT19937实际实现的one from rand 0.4.6,即使它们的拼写相同,但它们是截然不同且不相关的特征,因此不能互换引用.


所以我有几个问题:

  1. 如何在我的应用程序中使用适用于MT19937Rng特征?我认为我不能将我对rand的依赖降低到Cargo.toml中的0.4.6,因为我的应用程序中需要使用其他rand 0.8.5个.
  2. 一般来说,应该如何使用传递依赖中定义的特征?
  3. mersenne_twister‘S的API设计是不是不再出口Rng的糟糕做法?

推荐答案

您可以将一个依赖项的多个不兼容版本添加到Cargo.toml中.

[dependencies]
mersenne_twister = "1.1.1"
rand = "0.8.5"
old_rand = { package = "rand", version = "0.4.6" }

但对于这种情况,已经有一个更好的解决方案:使用MT19937箱,这取决于最新版本的rand_core.RNG实现应该依赖于rand_core而不是rand,因为它们所需要的只是Rng特性,而不是rand中的任何额外特性,比如发行版.

Rust相关问答推荐

go 掉包装 struct 中的泛型

常量泛型和类型枚举箱有重叠的用途吗?

在析构赋值中使用一些现有绑定

避免在Collect()上进行涡鱼类型的涂抹,以产生<;Vec<;_>;,_>;

为什么';t std::cell::ref使用引用而不是非空?

从未排序的链表中删除重复项的铁 rust 代码在ELSE分支的低级上做了什么?

什么时候使用FuturesOrdered?

如何轮询 Pin>?

在 Rust 中用问号传播错误时对类型转换的困惑?

具有多个键的 HashMap

可以在旋转循环中调用try_recv()吗?

返回迭代器考虑静态生命周期类型

闭包返回类型的生命周期规范

为什么 Rust 的临时值有时有参考性有时没有?

产生拥有值的迭代器的 Rust 可变borrow 在循环中失败

将 `&T` 转换为新类型 `&N`

返回引用字符串的future

没有分号的返回表达式的性能是否比使用返回更好?在Rust ?

通用函数中的生命周期扣除和borrow (通用测试需要)

为什么 Bevy 的 Trait 边界不满足 Rapier 物理插件?