2016-08-22 2 views
4

Например, если у меня есть код, как:Можно ли преобразовать строку в enum без макросов в Rust?

enum Foo { 
    Bar, 
    Baz, 
    Bat, 
    Quux 
} 

impl Foo { 
    from(input: &str) -> Foo { 
     Foo::input 
    } 
} 

Это, очевидно, не потому, что input не метод Foo. Я могу вручную набрать:

from(input: &str) -> Foo { 
    match(input) { 
     "Bar" => Foo::Bar, 
     // and so on... 
    } 
} 

но я не получаю автоматическое удобство.

Похоже, что Java имеет string lookup function на перечислениях для этой конкретной цели.

Можно ли получить это без написания собственного макроса или импорта из ящика?

+1

Что делать, если вместо '' Bar "' вам нужно '' Foo :: Bar "или' "my_module :: Foo :: Bar" или '" bar "'? Это помогает объяснить, почему нет готового способа сделать это. В стандартной библиотеке нет ничего, кроме того, что вы просто попросите рекомендации библиотеки/инструмента. – Shepmaster

+0

Я не думаю, что ваше редактирование в моем ответе необходимо: вы попросили автоматическое удобство, которое вы получили с ящиками, о которых я упоминал, и вам не нужно писать собственный макрос, потому что ящики уже предоставляют макрос. – antoyo

ответ

9

Вы можете использовать ящики enum_derive и custom_derive, чтобы сделать то, что вы хотите.

Вот Exemple:

#[macro_use] 
extern crate custom_derive; 
#[macro_use] 
extern crate enum_derive; 

custom_derive! { 
    #[derive(Debug, EnumFromStr)] 
    enum Foo { 
     Bar, 
     Baz, 
     Bat, 
     Quux 
    } 
} 

fn main() { 
    let variable: Foo = "Bar".parse().unwrap(); 
    println!("{:?}", variable); 
} 

derive обычая EnumFromStr позволяет использовать метод parse получить Foo.

+0

Хахаха, давай! Если бы я собирался быть таким приверженцем, я бы поставил под вопрос «не ответ», поскольку он фактически не отвечает на вопрос напрямую. Как говорится, «английский - это JavaScript-язык естественных языков» - пусть путаница настолько, что я могу подтолкнуть явно полезный ответ за порог и принять его, а? –

+0

Если это не то, что вы хотите, отредактируйте свой вопрос, потому что, как я сказал [здесь] (http://stackoverflow.com/questions/39070244/can-i-convert-a-string-to-enum-without -macros-in-rust/39070533 # comment-65517006), я не понимаю, почему он не отвечает на ваш вопрос. – antoyo

+0

Готово. Geez, после этого вы, ребята, попросите аннотации типа в вопросе ... –

Смежные вопросы