2016-04-05 41 views
0

Bir vektör üzerinde bir yineleyiciyi bir işleve geçiren bir çözümleyici yazmaya çalışıyorum. Kod bu benzer:Bir işleve iletilen yineleyicinin türünü nasıl yazarım?

fn foo(itr : ???) { 
    while let Some(c) = itr.next() { 
     if *c != 0 { 
      break; 
     } 
     println!("{}", *c); 
    } 
} 

fn main() { 
    let v = vec![0; 10]; 
    let itr = v.iter(); 
    while let Some(c) = itr.next() { 
     foo(itr); 
    } 
} 

Ben vektör üzerinde Yineleyici tipini nasıl yazılacağını emin değilim. u32 yanlış türünü rustc beklenen: core::slice::Iter<'_, _> beklemeye çalıştım. Ben core::slice rustc Use of undeclared type or module 'core::slice'

cevap

3

vardı; Çoğu zaman, gerçekten istediğiniz şey bunlardan herhangi birini tüketebilen bir işlevdir. Bunu yapmak için, deyimsel çözüm jenerik kullanmaktır. o foo içine itr hamle beri

fn foo<'a, T: Iterator<Item=&'a i32>>(mut itr: T) { 
    while let Some(c) = itr.next() { 
     if *c != 0 { 
      break; 
     } 
     println!("{}", *c); 
    } 
} 

fn main() { 
    let v = vec![0; 10]; 
    let mut itr = v.iter(); 
    while let Some(c) = itr.next() { 
     foo(itr); 
    } 
} 

kod yukarıdaki sonra while let üzerine yeniden kullanmaya çalışır, olsa derleme değil. Bunu çözmek için, yineleyiciyi bunun yerine başvurmak zorundayız. Pas kitaptan trait objects bölüm bu çözümleri arasındaki farkı açıklar

fn foo<'a>(itr: &mut Iterator<Item=&'a i32>) { 
    while let Some(c) = itr.next() { 
     if *c != 0 { 
      break; 
     } 
     println!("{}", *c); 
    } 
} 

fn main() { 
    let v = vec![0; 10]; 
    let mut itr = v.iter(); 
    while let Some(c) = itr.next() { 
     foo(&mut itr); 
    } 
} 

: Yerine jenerik

fn foo<'a, T: Iterator<Item=&'a i32>>(itr: &mut T) { 
    while let Some(c) = itr.next() { 
     if *c != 0 { 
      break; 
     } 
     println!("{}", *c); 
    } 
} 

fn main() { 
    let v = vec![0; 10]; 
    let mut itr = v.iter(); 
    while let Some(c) = itr.next() { 
     foo(&mut itr); 
    } 
} 

, biz de bir özellik nesnesi kullanabilirsiniz.

+0

Müthiş! Yinelemeli bir yoklayıcı ayrıştırıcıda olduğu gibi karşılıklı özyinelemeli işlevleriniz varsa, FYI, jenerik kullanırsanız, pasaç derlenmez, ancak bir özellik nesnesi kullanırsanız, çalışır. –

0

şikayet kullanmaya çalıştığınızda çözüm

use std::slice::Iter; 

eklemek ve tipi Yineleyicilerin birçok türü vardır

fun foo<'a>(itr : &mut Iter<'a, i32>) {} 
+2

Bu işlevin yalnızca işlevlerin iter() yöntemi tarafından döndürülen yineleyicilerle kullanılmasına izin verileceğini unutmayın, ancak, "iter(). Map (| x | ...)) çünkü başka bir türü var. FrancisGagné'nin önerdiği gibi, burada jenerik kullanmanız gerekiyor. –

İlgili konular