Как мне вернуть строку перечисления по определенному индексу? - PullRequest
0 голосов
/ 14 мая 2018

Какой самый простой способ добиться этого?

enum E {
    A,
    B,
    C,
}

// Should return "A" for 0, "B" for 1 and "C" for 2
fn convert(i: u32) -> str {
    // ???
}

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Вы не можете вернуть str, но вы можете вернуть &str.Объединить идеи из Как сопоставить значения перечисления с целым числом? и Получить перечисление в виде строки :

#[macro_use]
extern crate strum_macros;
extern crate strum;

use strum::IntoEnumIterator;

#[derive(EnumIter, AsRefStr)]
enum E {
    A,
    B,
    C,
}

fn main() {
    let e = E::iter().nth(2);
    assert_eq!(e.as_ref().map(|e| e.as_ref()), Some("C"));
}
0 голосов
/ 14 мая 2018

Необходимо было добавить атрибут #[derive(Debug)] и определить реализацию для перечисления:

#[derive(Debug)]
#[derive(Copy, Clone)]
enum E {
    A,
    B,
    C,
}

impl E {
    fn from(t: u8) -> E {
        assert(t<=enum_to_int(E::C), "Enum range check failed!");
        let el: E = unsafe { std::mem::transmute(t) };
        return el;
    }
    fn to_string(&self) -> String {
        return format!("{:?}", self);
    }

    fn string_from_int(t: u8) -> String {
        return E::from(t).to_string();
    }
}


fn enum_to_int(el: &E) -> u8 {
    *el as u8
}

Затем его можно использовать следующим образом:

fn main() {
    let s = E::string_from_int(3 as u8);
    println!("{}", s);
}
...