2013-08-05 1 views
2

Pour le code:Accès au contenu d'un ENUM avec un pointeur appartenant à une boucle

enum A { 
    Foo, 
    Bar, 
    Baz(~str) 
} 

#[test] 
fn test_vector(){ 
    let test_vec = ~[Foo, Bar, Baz(~"asdf")]; 

    for x in test_vec.iter() { 
     match x { 
      &Foo => true, 
      &Bar => true, 
      &Baz(x) => x == ~"asdf" 
     }; 
    } 
} 

Je reçois l'erreur suivante:

stackoverflow.rs:15:13: 15:19 error: cannot move out of dereference of & pointer 
stackoverflow.rs:15    &Baz(x) => x == ~"asdf" 
          ^~~~~~ 
error: aborting due to previous error 

Si je change la chaîne à un int il compile bien.

Mes questions sont: Comment puis-je accéder au contenu d'un pointeur appartenant à une énumération dans une boucle for? Y a-t-il un autre itérateur que je devrais utiliser?

La version de Rust que j'utilise est compilée à partir du maître.

+2

Je ne suis pas près de mon ordinateur, et 0,7 ne parvient pas à installer sur cet ordinateur portable, mais je pense que vous devriez essayer '& Baz (ref x)' . –

Répondre

1

Les variables dans les cas de correspondance sont déplacées par défaut. Vous n'êtes pas autorisé à déplacer x, car tout en boucle est immuable. Pour obtenir une référence à x str vous devez utiliser ref mot-clé:

&Baz(ref x) => *x == ~"asdf" 
+1

Notez que '" asdf "== * x' ou' x.as_slice() == "asdf" 'sera plus efficace, car ils n'ont pas l'allocation. (Le fait qu'il n'est pas possible d'écrire simplement '* x ==" asdf "' est considéré comme un bug.) – huon

Questions connexes