我试图从一个生 rust 的板条箱调用一个方法,并得到一个错误,说明一个特征没有实现的方法之一,我传递,但当我查找该方法在www.example.com上,它似乎是实现所需的特征。docs.rs it does appear to be implementing the required trait.
我正在尝试从名为wagyu_ethereum的机箱调用名为new_with_count
的方法。
我用来打电话的代码如下:
use rand::{rngs::StdRng, SeedableRng};
use wagyu_ethereum::*;
use wagyu_model::mnemonic::MnemonicCount;
use wagyu_model::MnemonicError;
pub fn generate_mnemonic() -> Result<String, MnemonicError> {
let mut rng = StdRng::from_entropy();
let mnemonic = EthereumMnemonic::<
wagyu_ethereum::network::Mainnet,
wagyu_ethereum::wordlist::English,
>::new_with_count(&mut rng, 24)?;
Ok(String::from("placeholder"))
}
方法的代码(来自项目GitHub page:
impl<N: EthereumNetwork, W: EthereumWordlist> MnemonicCount for EthereumMnemonic<N, W> {
/// Returns a new mnemonic given the word count.
fn new_with_count<R: Rng>(rng: &mut R, word_count: u8) -> Result<Self, MnemonicError> {
let length: usize = match word_count {
12 => 16,
15 => 20,
18 => 24,
21 => 28,
24 => 32,
wc => return Err(MnemonicError::InvalidWordCount(wc)),
};
let entropy: [u8; 32] = rng.gen();
Ok(Self {
entropy: entropy[0..length].to_vec(),
_network: PhantomData,
_wordlist: PhantomData,
})
}
}
错误:
error[E0277]: the trait bound `StdRng: rand_core::RngCore` is not satisfied
--> src/lib.rs:12:23
|
9 | let mnemonic = EthereumMnemonic::<
| ____________________-
10 | | wagyu_ethereum::network::Mainnet,
11 | | wagyu_ethereum::wordlist::English,
12 | | >::new_with_count(&mut rng, 24)?;
| | - ^^^^^^^^ the trait `rand_core::RngCore` is not implemented for `StdRng`
| |_____________________|
| required by a bound introduced by this call
|
= help: the following other types implement trait `rand_core::RngCore`:
&'a mut R
Box<R>
rand::rngs::adapter::read::ReadRng<R>
rand::rngs::adapter::reseeding::ReseedingRng<R, Rsdr>
rand::rngs::entropy::EntropyRng
rand::rngs::mock::StepRng
rand::rngs::std::StdRng
rand::rngs::thread::ThreadRng
and 6 others
= note: required because of the requirements on the impl of `rand::Rng` for `StdRng`
note: required by a bound in `new_with_count`
--> /home/me/.cargo/registry/src/github.com-1ecc6299db9ec823/wagyu-model-0.6.3/src/mnemonic.rs:44:26
|
44 | fn new_with_count<R: Rng>(rng: &mut R, word_count: u8) -> Result<Self, MnemonicError>;
| ^^^ required by this bound in `new_with_count`
就我所知,documentation on docs.rs似乎确实实现了RngCore
。我还发现question表明我可能借用了很多次,但我不确定它是否与此相关,因为我不认为我借用了很多次。
最后,在Github项目账户上,他们有调用方法的示例,方法调用和rng赋值的方式和我一样。这就是促使我使用这个方法的原因。当你运行他们的程序时,他们的程序也能工作。所以我的问题是,当我试图调用这个方法时,我做错了什么?
1条答案
按热度按时间kq0g1dla1#
在编写本报告时,最新版本为:
rand = "0.8.5"
wagyu-ethereum = "0.6.3"
wagyu-model = "0.6.3"
这里似乎存在版本不匹配。
wagyu-ethereum = "0.6.3"
依赖于rand = "0.7.3"
,而如果您使用cargo add rand
,则当前默认值为rand = "0.8.5"
。在
cargo tree
中可以看到:通常,Cargo会尝试为所有依赖项找到一个库的通用版本,但根据Rust's semver rules,
0.7.x
和0.8.x
不兼容,因此它包含了两个库。当然,它不能允许这两个库一起使用,因为结果将不可预测。虽然问题复杂而模糊,但解决办法很简单:
在
Cargo.toml
中使用rand = "0.7.3"
,直到wagyu
升级到rand = "0.8.x"
。你可以在their issue-tracker上发布一个关于这个项目的问题,但是看起来这个项目作为一个整体已经一年多没有得到维护了。他们的网站甚至已经不存在了。所以要注意这个项目可能会被放弃。