Crate sha2
包含Sha256
类型,它实现了包Digest
中定义的特征digest
。此特征也会从sha2
重新导出。
我想写一个不提及sha2
的文件,只是digest
:
merkle_tree.rs:
use digest::Digest;
#[derive(Default)]
pub struct MerkleTree<T: Digest> {
digest: T,
}
impl<T: Digest+Default> MerkleTree<T> {
pub fn new() -> MerkleTree<T> {
MerkleTree{ ..Default::default() }
}
}
main.rs:
extern crate digest;
extern crate sha2;
mod merkle_tree;
use sha2::{Digest, Sha256};
use merkle_tree::MerkleTree;
fn main() {
let mut mt = MerkleTree::<Sha256>::new();
println!("Hello, world!");
}
我有以下输出:
错误:找不到类型名为
未实施特征new
的关联项 当前范围内的merkle_tree::MerkleTree<sha2::Sha256>
digest::Digest
sha2::Sha256
Cargo.toml:
[package]
name = "merkle_tree"
version = "0.1.0"
authors = ["Simon Prykhodko <semion.ababo@gmail.com>"]
[dependencies]
digest = "0.4.0"
sha2 = "0.3.0"
这里有什么问题?
答案 0 :(得分:3)
您正在使用的digest
和digest
crate正在使用的sha2
不兼容。他们有相同的名字是无关紧要的;就编译器而言,你试图将两个完全不同的板条箱混为一谈。
最简单的方法是查看digest
在编译期间是否多次出现,或在Cargo.lock
文件中出现多次。您还可以通过查看包依赖项来手动验证。 sha2
0.3.0在其依赖项中列出digest
0.3,而0.3与0.4不兼容。
您需要降低包装箱对digest
的依赖关系,或将包装箱的sha2
版本升级为使用较新版digest
的版本。
答案 1 :(得分:0)
我刚刚运行了你的代码,它使用这些依赖版本编译得很好:
[dependencies]
sha2 = "0.4.2"
digest = "0.4.0"
尝试更新其中一个或两个。