2017-04-03 5 views
0

クレートsha2は、タイプSha256を含み、Digestのクレートdigestで定義された形質を実装します。この形質もsha2から再輸出されています。異なるクレートの形質を具現する構造体を使用する

私はちょうどdigestsha2に言及していないファイルを書きたい:

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!"); 
} 

を私は次の出力を持っています:

error: no associated item named new found for type merkle_tree::MerkleTree<sha2::Sha256> in the current scope the trait digest::Digest is not implemented for sha2::Sha256

Cargo.tomlは:

[package] 
name = "merkle_tree" 
version = "0.1.0" 
authors = ["Simon Prykhodko <[email protected]>"] 

[dependencies] 
digest = "0.4.0" 
sha2 = "0.3.0" 

ここで何が悪いのでしょうか?

+0

@ababoなぜあなたは 'sha2 =" 0.3.0 "'を使用していますか?最新バージョンは「0.4.2」です。 – kennytm

答えて

3

digest使用しているのdigestは、互換性がありません。彼らが同じ名前を持っていることは無関係です。コンパイラに関しては、まったく別の2つのクレートを組み合わせようとしています。

コンパイル時にdigestが複数回表示されるか、Cargo.lockファイルに複数回表示されるかを確認するのが最も簡単な方法です。クレートの依存関係を調べることでこれを手動で確認することもできます。 sha2 0.3.0は、依存関係にあるdigest 0.3をリストし、0.3は0.4と互換性がありません。

クレートの依存関係をdigestにダウングレードするか、sha2のクレートのバージョンをdigestの新しいバージョンを使用するバージョンにアップグレードする必要があります。

0

私はちょうどあなたのコードを実行し、それがこれらの依存関係のバージョンで正常にコンパイル:

[dependencies] 
sha2 = "0.4.2" 
digest = "0.4.0" 

は、いずれか、または両方をアップデートしてみてください。

関連する問題