Как прочитать значение перечисления, которое ассоциируется с пользовательским типом в Rust? - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть реализация в Rust следующим образом.В основной функции я читаю значение в SalaryRange enum, и это отобразит High("So High").

// This can be a complex type, just using string for the question 
type SRange = String;
type SalEnu = SalaryRange<SRange>;

struct User<SRange> {
    username: String,
    email: String,
    sign_in_count: u64,
    active: bool,
    income: Income<SRange>,
}

struct Income<SRange> {
    salary_range: SalaryRange<SRange>
}

#[derive(Debug)]
enum SalaryRange<SRange> {
    Low(SRange),
    Mid(SRange),
    High(SRange),
}

fn main() {
    let user1 = User {
        email: String::from("test@email.com"),
        username: String::from("test_name"),
        active: true,
        sign_in_count: 1,
        income: Income {
            salary_range: (
                SalaryRange::High("So High")
            )
        },
    };
    let mut srange: SalaryRange<&str> = user1.income.salary_range;
    println!("{:?}", srange);
}

Ссылку для этого примера можно найти здесь.

Просто хотел узнать, есть ли возможность прочитать и распечатать значение в этом перечислении как println!("{:?}", srange::High);, просто чтобы распечатать строковое значение?Я только хочу напечатать значение So High.

Если я использую srange::High Это выдаст сообщение об ошибке

      println!("{:?}", srange::High);
|                      ^^^^^^ use of undeclared type or module `srange`
error: aborting due to previous error

Ответы [ 2 ]

0 голосов
/ 25 февраля 2019

Вы можете реализовать метод в вашем перечислении для извлечения значения:

#[derive(Debug)]
enum SalaryRange<S> {
    Low(S),
    Mid(S),
    High(S),
}

impl<S> SalaryRange<S> {
    fn value(&self) -> &S {
        match self {
            SalaryRange::Low(value) => value,
            SalaryRange::Mid(value) => value,
            SalaryRange::High(value) => value,
        }
    }
}
println!("{:?}", srange.value());
0 голосов
/ 25 февраля 2019

Вы можете сопоставить шаблон srange с синтаксисом if let.

if let SalaryRange::High(s) = srange {
    println!("{}", s);
}

напечатает «так высоко».

...