Проблемы Инициализации Структуры Ржавчины

#struct #rust

Вопрос:

Создаю карточную игру, чтобы научиться ржаветь. Возникли проблемы с инициализацией моей структуры.

 enum Effect {
    Passive,
    EarnEffect,
    ChargeEffect,
}

struct EarnEffect {
    amount: i8,
    per: Option<Tag>,
}

struct Card {
    effect: Effect
}
 

Уже пробовали следующее:

 Card { effect: Effect::EarnEffect { amount: 1, per: None }}
 

и

 Card { effect: EarnEffect { amount: 1, per: None }}
 

Ответ №1:

Ваш вариант перечисления и ваша структура являются двумя отдельными сущностями, даже если вы дали им одно и то же имя.

 enum Effect {
    Passive,
    EarnEffect,
    ChargeEffect,
}
 

явно означает, что перечисление может иметь ровно 3 возможных значения без каких-либо дополнительных данных. Вы можете связать данные с переменной перечисления с любым

 enum Effect {
    Passive,
    // Struct-like syntax
    EarnEffect {
      amount: i8,
      // ...
    },
    ChargeEffect,
}
 

или

 enum Effect {
    Passive,
    // Tuple-like syntax
    EarnEffect(i8),
    ChargeEffect,
}
 

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

Вариант 1

 enum Effect {
    Passive,
    EarnEffect {
        amount: i8,
        per: Option<Tag>,
    },
    ChargeEffect,
}

struct Card {
    effect: Effect
}
 

с

 Card { effect: Effect::EarnEffect { amount: 1, per: None }}
 

Вариант 2

 enum Effect {
    Passive,
    EarnEffect(EarnEffect),
    ChargeEffect,
}

struct EarnEffect {
    amount: i8,
    per: Option<Tag>,
}

struct Card {
    effect: Effect
}
 

с

 Card { effect: Effect::EarnEffect(EarnEffect { amount: 1, per: None }) }