2016-08-08 14 views
0

私はこの小さなスニペットを持っているが、それはコンパイルされませんし、すべてのエラーがcombinations_n戻り&Vec<&u8>の代わり&Vec<u8>その事実から生じます。ここで期待タイプ `&Vecを<u8>`、見つかった `&Vecを<&u8>`

extern crate itertools; 

use std::io; 
use std::collections::BTreeMap; 
use std::iter::Enumerate; 
use itertools::Itertools; 

const RANKS: [u8; 13] = [12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]; 

fn is_straight(hand: &Vec<u8>) -> bool { 
    for (i, h) in hand[1..].iter().enumerate() { 
     if h - hand[i] != 1 { 
      return false; 
     } 
    } 
    true 
} 

fn hand_value(hand: &Vec<u8>) -> u8 { 
    hand.iter().fold(0_u8, |a, &b| a + 2u8.pow(b as u32)); 
} 

fn generate_flush_table() -> BTreeMap<u8,u8> { 
    let ft = BTreeMap::new(); 
    let mut straight_counter = 1; 
    let mut other_counter = 323; 
    for flush in RANKS.iter().combinations_n(5) { 
     if flush == [12, 3, 2, 1, 0] { 
      continue; 
     } else if is_straight(&flush) { 
      ft.insert(hand_value(&flush), straight_counter); 
      straight_counter += 1; 
     } else { 
      ft.insert(hand_value(&flush), other_counter); 
      other_counter += 1; 
     } 
    } 
    ft 
} 


fn main() { 
    let flush_table: BTreeMap<u8,u8> = generate_flush_table(); 
    for (key, value) in flush_table.iter() { 
     println!("{}: {}", key, value); 
    } 
} 

は、コンパイラが言っていることだ:

error: the trait bound `&u8: std::cmp::PartialEq<_>` is not satisfied [E0277] 
     if flush == [12, 3, 2, 1, 0] { 
      ^~~~~~~~~~~~~~~~~~~~~~~~~ 
help: run `rustc --explain E0277` to see a detailed explanation 
help: the following implementations were found: 
help: <u8 as std::cmp::PartialEq> 
note: required because of the requirements on the impl of `std::cmp::PartialEq<[_; 5]>` for `std::vec::Vec<&u8>` 
error: mismatched types [E0308] 
     } else if is_straight(&flush) { 
           ^~~~~~ 
help: run `rustc --explain E0308` to see a detailed explanation 
note: expected type `&std::vec::Vec<u8>` 
note: found type `&std::vec::Vec<&u8>` 
error: mismatched types [E0308] 
      ft.insert(hand_value(&flush), straight_counter); 
           ^~~~~~ 
help: run `rustc --explain E0308` to see a detailed explanation 
note: expected type `&std::vec::Vec<u8>` 
note: found type `&std::vec::Vec<&u8>` 
error: mismatched types [E0308] 
      ft.insert(hand_value(&flush), other_counter); 
           ^~~~~~ 
help: run `rustc --explain E0308` to see a detailed explanation 
note: expected type `&std::vec::Vec<u8>` 
note: found type `&std::vec::Vec<&u8>` 

私は本当にflushの種類が本当にcombinations_nCombinationsNを返し、ドキュメントに、私は

を読むことを考えると、 &Vec<&u8>可能性がどのように理解していません
impl<I> Iterator for CombinationsN<I> 
    where I: Iterator, 
      I::Item: Clone 
{ 
    type Item = Vec<I::Item> 

となるので、実際にはVec<u8>である必要があります。

答えて

3

プロのプログラマーとして、Minimal, Complete, and Verifiable exampleを作成することを学ぶ必要があります。

extern crate itertools; 
use itertools::Itertools; 

const RANKS: [u8; 13] = [12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0]; 

fn main() { 
    let one_combination:() = RANKS.iter().combinations_n(5).next(); 
} 

関連のエラーで失敗します:ここにあなたの問題の一つがある

error: mismatched types [E0308] 
    let one_combination:() = RANKS.iter().combinations_n(5).next(); 
           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
help: run `rustc --explain E0308` to see a detailed explanation 
note: expected type `()` 
note: found type `std::option::Option<std::vec::Vec<&u8>>` 

これはcombinations_nのこの特定呼び出しがVec<&u8>、ないVec<u8>生み出すないことを示します。

これはなぜですか?

CombinationsNの定義からこの行は、キーです:

type Item = Vec<I::Item> 

CombinationsNイテレータアダプタなので、I::Itemは、その前のイテレータの一種です。私たちの場合、それは何ですか?この持ちslice::Iter、:スライスを反復処理により

type Item = &'a T 

をので、あなたは、スライスの要素への参照を取得し、その後参照自体はその後参照のクローンと収集CombinationsNに渡され、それはVecに入ります。

RANKS.iter().cloned().combinations_n(5) 
+0

ありがとう:

一つの解決策は、反復要素のクローンを作成することです。私は実際にかなりのコードを削除し、十分に小さな例だと思った。私は将来もっと気をつけなければならない。詳しい説明もありがとう。 – rubik

+0

@rubikの心配!私はちょうど例を細くするためのいくつかのより多くのステップがあるので、作成することができるより小さなバージョンを指摘する傾向があります。少なくともあなたの質問には、問題を実際に再現するのに十分な情報が含まれていました。^_ ^ – Shepmaster

関連する問題