2016-05-13 2 views
2

J'ai construit un itérateur qui génère une liste infinie de nombres premiers. Les types ressemblent à ceci:Comparaison d'un itérateur avec un tableau (de taille fixe)

pub struct Primes { … } 

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

Maintenant, je veux tester si mon iterator retourne les valeurs correctes en comparant les 100 premières valeurs contre celles correctes:

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

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

Je ne sais pas comment comparez ces valeurs. J'ai essayé de créer une tranche (first_100_primes[..]), en recueillant les valeurs d'itérateur, mais je ne semble pas pouvoir les comparer.

+0

Malheureusement , le trait IntoIterator n'est défini que pour [T; N] 'si' N <= 32'. Donc, je crois que ce n'est pas la même chose que de comparer les itérateurs. – Sebastian

+0

Voir aussi [Existe-t-il un moyen intégré de comparer deux itérateurs?] (Http://stackoverflow.com/q/30540822/155423) – Shepmaster

+0

'IntoIterator' n'est pas implémenté pour * tout * tableau, peut-être vouliez-vous dire quelque chose? autre? De toute façon, vous [pouvez obtenir un itérateur des valeurs attendues] (https://play.rust-lang.org/?gist=253547197eb8e7d678a8395602442cf2&version=stable&backtrace=0). – Shepmaster

Répondre

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

que j'étais Transforme très proche, je crois que cela fonctionne:

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

(Bien que je ne suis pas sûr que ce soit la façon de le faire rustacean ...)

+0

Je préfère la réponse sur le duplicata, donc je pense que je vais l'utiliser :) – Sebastian