2013-08-05 5 views
2

Для кода:Доступа к содержанию в перечислении с принадлежащем указателем в циклю

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" 
     }; 
    } 
} 

Я получаю следующее сообщение об ошибке:

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 

Если изменить строку в междунар так ли компилирует штраф.

Мои вопросы: Как получить доступ к содержимому принадлежащего указателю в перечислении в цикле for? Есть ли альтернативный итератор, который я должен использовать?

Версия Rust, которую я использую, скомпилирована из мастера.

+2

Я не рядом с моим компьютером, и 0.7 не удается установить на этом ноутбуке, но я думаю, вы должны попробовать '& Баз (исх х)' , –

ответ

1

Переменные в совпадающих случаях перемещаются по умолчанию. Вам не разрешено перемещать x, потому что все в цикле является неизменным. Для того, чтобы получить ссылку на x ул вам нужно использовать ref ключевое слово:

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

Обратите внимание, что '' asdf "== * x' или' x.as_slice() == "asdf" 'будет более эффективным, так как у них нет выделения. (Тот факт, что невозможно просто написать '* x ==" asdf "', считается ошибкой.) – huon