#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 }) }