私はこの小さなスニペットを持っているが、それはコンパイルされませんし、すべてのエラーが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_n
がCombinationsN
を返し、ドキュメントに、私は
&Vec<&u8>
可能性がどのように理解していません
impl<I> Iterator for CombinationsN<I>
where I: Iterator,
I::Item: Clone
{
type Item = Vec<I::Item>
となるので、実際にはVec<u8>
である必要があります。
ありがとう:
一つの解決策は、反復要素のクローンを作成することです。私は実際にかなりのコードを削除し、十分に小さな例だと思った。私は将来もっと気をつけなければならない。詳しい説明もありがとう。 – rubik
@rubikの心配!私はちょうど例を細くするためのいくつかのより多くのステップがあるので、作成することができるより小さなバージョンを指摘する傾向があります。少なくともあなたの質問には、問題を実際に再現するのに十分な情報が含まれていました。^_ ^ – Shepmaster