2016-05-13 113 views
2

我構建了一個迭代器,用於生成無限的素數列表。該類型是這樣的:將迭代器與(固定大小)數組進行比較

pub struct Primes { … } 

impl Iterator for Primes { 
    type Item = u32; 
    fn next(&mut self) -> Option<Self::Item> { … } 
} 

現在我想測試,如果我的迭代器通過比較 對正確的人的第一個100倍的值返回正確的價值觀:

#[test] 
fn first_thousand() { 
    assert_eq!(
     Primes::new().take(100), 
     first_100_primes 
    ); 
} 

const first_100_primes: [u32; 100] = [2, 3, …, 541]; 

我不知道該怎麼比較這些值。我嘗試創建一個分片(first_100_primes[..]),收集迭代器值,但我似乎無法比較它們。

+0

不幸,IntoIterator特徵僅爲'[T; N]'如果'N <= 32'。所以我相信它和比較迭代器是不一樣的。 – Sebastian

+0

另請參見[是否有內置的方法來比較兩個迭代器?](http://stackoverflow.com/q/30540822/155423) – Shepmaster

+0

IntoIterator沒有爲任何*數組實現,也許你的意思是其他?無論哪種方式,您[可以獲得預期值的迭代器](https://play.rust-lang.org/?gist=253547197eb8e7d678a8395602442cf2&version=stable&backtrace=0)。 – Shepmaster

回答

3
let is_correct = Primes::new() 
    .zip(FIRST_100_PRIMES.iter()) 
    .all(|(a, &b)| a == b); 
assert!(is_correct); 
1

原來我真的很接近,我相信這個工程:

#[test] 
fn first_thousand() { 
    assert_eq!(
     FIRST_100_PRIMES[..], 
     Primes::new().take(100).collect::<Vec<_>>()[..] 
    ); 
} 

(雖然我不知道這是做它的rustacean方式......)

+0

我更喜歡重複的答案,所以我想我只會用那個:) – Sebastian