2016-04-08 11 views
1

Ben adında bir enum Token (ben kurmaya çalışıyorum tahmin edebiliyor: P)yapı bozma ederken Vec <Sıralama (dize)> yineleme

Böyle bir sürü kötü görünüyor:

enum Token { 
    Paren(String), 
    Number(String), 
    Name(String), 
} 

Şimdi, aşağıdaki imzası ile bir işlevi vardır:

fn tokenizer(input: String) -> Vec<Token>

Ben temelde çalışmıyor inanmak için hiçbir neden yok, bu yüzden Obvio usiller bir Vec<Token> var.

Şimdi, benim ana işlevinde ben

bu:

let tokens = tokenizer("(add 44 5)".to_owned()); 

ve aşağıdaki gibi bir şey yapmak istiyorum:

let mut iter = tokens.iter(); 
while let Some(token) = iter.next() { 
    match token { 
     Token::Paren(p) => println!("Token::Paren({})", p), 
     Token::Number(p) => println!("Token::Number({})", p), 
     Token::Name(p) => println!("Token::Name({})", p), 
    } 
} 

Ama açıkçası ödünç denetleyici değil mi' Bu kadar kolay çıkmama izin ver.

Bunu yapmanın doğru yolu nedir? Açıkçası, bu projenin doğası gereği umduğum gibi, sadece Rust'u öğrenmeye çalışıyorum, bu yüzden herhangi bir tavsiye, doğrudan sorunla doğrudan ilgili olmasa bile yararlı olacaktır. =)

cevap

3

Enum'unuz, iletilen dizelere sahiptir ve böylece onları imha etmek için bunları değere göre yakalamaya çalışın (ve onu enum dışına taşıyın).

ref p numaralı telefonu kullanarak bu sorunu giderebilirsiniz. Eğer vektör belirteçleri başvurular döndürür iter() kullandığınız için ayrıca belirteci KQUEUE gerekir

match *token { 
    Token::Paren(ref p) => println!("Token::Paren({})", p), 
    Token::Number(ref p) => println!("Token::Number({})", p), 
    Token::Name(ref p) => println!("Token::Name({})", p), 
} 

Working sample on the Playpen

Not. into_iter() kullandıysanız, sahipliğini aktarır ve başvurularda eşleşemezsiniz .. ancak tokens değişkeniniz artık değerler taşınırken kesilir.

+0

Kahramanım! Başka bir soru sorabilirsem, çünkü eşleşme bloğu içinde şablon eşleştirmesi yapıyoruz, bu bir harekete mi, bir kopyaya mı neden oluyor? Rust'a çok yeni geldim. =) –

+1

Onları nasıl yakaladığınıza bağlıdır. Orijinaliniz harekete neden oluyordu (ya da onu hareket ettirmeye çalışıyordu) çünkü 'p' değeriyle yakalanıyordunuz. Ref'i kullanmak onu referans olarak yakalar ve bu nedenle taşımamaktadır. Burada düşünülecek başka şeyler de var, ancak sadece eşleme bloklarınız gerçek kod blokları haline geldikçe ve bunlara biraz karmaşıklık sağladıkça açıklamaya ihtiyaç duyacaklar. Dikkate alınması gereken başka bir şey de türünüzün 'Kopya' olup olmadığıdır .. ama yine de bunun hakkında daha sonra endişelenmeniz yeterlidir :) –

+1

'Eşleme * belirteci {...} 'yazmak için deyimsel olarak kabul edilir. –