使用从不同的包中实现特征的结构

时间:2017-04-03 08:03:09

标签: rust

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"

这里有什么问题?

2 个答案:

答案 0 :(得分:3)

您正在使用的digestdigest 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"

尝试更新其中一个或两个。