[derive(Read)
卡尔云官网
www.kaeryun.com
Um die obige Anforderung zu erfüllen, definiere wir folgende Implementierung:
trait CharIter { type Next = Option<Char>; fn next(&mut Next, &str) -> Option<Char>; } impl CharIter for String { type Next = Option<Char>; fn next(&mut Next, &str) -> Option<Char> { if let Some(i) = &mut Next { if i >= str.len() { None } else { if str[i].is_alphabetic { Some(str[i]) } else { None } } } else { None } } } impl StringIter for String { type Next = Option<Char>; fn next(&mut Next, &str) -> Option<Char> { if let Some(i) = &mut Next { if i >= str.len() { None } else { Some(str[i]) } } else { None } } } pub fn char_iter(s: &str) -> Option<Char> { if let Some(i) = &mut s { if i >= s.len() { None } else { Some(s[i]) } } else { None } } pub struct String { type Data = &str; type Length = usize; type Valid = bool; type Index = usize; type ReadType = Option<Data>; type Next = Option<Data>; }
Die obige Implementierung definiert den CharIter
Trait, der die next
-Methode implementiert, um die Validität des Zeichenindex zu überprüfen und die Buchstaben zu filtern. Die StringIter
Implementierung arbeitet mit dem CharIter
Trait, und die char_iter
Funktion gibt Some(Option<Char>)
zurück, je ob das Zeichen ein Buchstabe ist.
Um die Funktion zu testen, können Sie folgendes tun:
fn main() { let s = "abc123XYZ456"; println!("CharIter: {:?}", char_iter(s)); println!("StringIter: {:?}", StringIter::from(s)); }
Diese Funktionen überprüfen, ob das Zeichen ein Buchstabe ist und liegen im Validitätsbereich.
卡尔云官网
www.kaeryun.com