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

Я хочу напечатать данные перечисления кортежей без именованных полей.

Кортеж - это общий способ объединения некоторого числа других значений с различными типами в один составной тип.

#[derive(Debug)]
enum Coin {
    Penny(String),
    Nickel { id: String },
}

fn main() {
    let penny = Coin::Penny(String::from("penny"));
    let nickel: Coin = Coin::Nickel { id: String::from("nickel") };

    println!("{} {:?} ", penny.0, penny);
    println!("{:?}", nickel);
}

В этом примере Nickel является структурно-подобным вариантом перечисления, тогда как Penny просто называется перечислением варианта .

Я получаю ошибку компилятора:

error[E0609]: no field `0` on type `Coin`
For more information about this error, try `rustc --explain E0609`.

Ответы [ 2 ]

0 голосов
/ 02 сентября 2018

Пример использования оператора match:

#[derive(Debug)]
enum Coin {
    Penny(String),
    Nickel { id: String },
}

fn main() {
    let penny = Coin::Penny(String::from("penny"));
    let nickel: Coin = Coin::Nickel {
        id: String::from("nickel"),
    };

    match &penny {
        Coin::Penny(id) => {
            println!("{}; {:?}", id, penny);
        }
        _ => {}
    }

    match &nickel {
        Coin::Nickel { id } => {
            println!("{}; {:?}", id, nickel);
        }
        _ => {}
    }
}

Ссылка на игровую площадку

0 голосов
/ 02 сентября 2018

Вы можете использовать оператор match или, альтернативно, оператор if let, чтобы использовать значение варианта:

#[derive(Debug)]
enum Coin {
    Penny(String),
    Nickel { id: String },
}

fn main() {
    let penny = Coin::Penny(String::from("penny"));
    let nickel: Coin = Coin::Nickel {
        id: String::from("nickel"),
    };

    if let Coin::Penny(name) = penny {
        println!("{}", name);
    }

    if let Coin::Nickel{ id } = nickel {
        println!("{}", id);
    }
}

Ссылка на игровую площадку

...