2016-05-13 15 views
2

Ich baute einen Iterator, der eine unendliche Liste von Primzahlen generiert. Die Typen wie folgt aussehen:Vergleiche Iterator mit (feste Größe) Array

pub struct Primes { … } 

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

Jetzt will ich testen, ob meine Iterator die richtigen Werte zurückgibt durch die ersten 100 Werte gegen die richtigen sind zu vergleichen:

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

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

Ich weiß nicht, wie man vergleiche diese Werte. Ich habe versucht, einen Ausschnitt (first_100_primes[..]) zu erstellen, der die Iterator-Werte sammelt, aber ich kann sie nicht vergleichen.

+0

Leider , das IntoIterator-Merkmal wird nur für '[T; N] 'wenn' N <= 32 '. Also ich glaube, es ist nicht dasselbe wie Iteratoren zu vergleichen. – Sebastian

+0

Siehe auch [Gibt es eine integrierte Möglichkeit, zwei Iteratoren zu vergleichen?] (Http://stackoverflow.com/q/30540822/155423) – Shepmaster

+0

'IntoIterator' ist nicht für * any * Array implementiert, vielleicht haben Sie etwas gemeint sonst? In beiden Fällen können Sie [einen Iterator der erwarteten Werte erhalten] (https://play.rust-lang.org/?gist=253547197eb8e7d678a8395602442cf2&version=stable&backtrace=0). – Shepmaster

Antwort

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

Stellt sich heraus, ich war ganz in der Nähe, ich glaube, das funktioniert:

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

(Obwohl ich nicht sicher bin, ob dies der rustacean Weg ist, es zu tun ...)

+0

Ich bevorzuge die Antwort auf das Duplikat, also denke ich, dass ich nur dieses verwenden werde :) – Sebastian