Нет, насколько я знаю.
Перечисления в ржавчине - это не «пучок постоянных значений», как в C. Существует поддержка связывания числовых значений с константами, но это все. Конечно, вы могли бы создавать константы любого имени, но они не позволяли бы шаблону сопоставлять значение перечисления.
В известном смысле псевдоним в варианте перечисления немного напоминает псевдоним в поле типа. Я никогда не видел появления одного поля, идентифицированного двумя именами; Интересно, есть ли какой-нибудь язык, который его поддерживает.
Решение, которое я хотел бы предложить его стиснуть зубы и создать два отдельных перечислений с конверсией между ними:
use std::convert::From;
enum Side {
Left,
Right,
}
enum PortSide {
Port,
Starboard,
}
#[cfg(not(universe = "mirror"))]
impl From<Side> for PortSide {
fn from(s: Side) -> PortSide {
match s {
Side::Left => PortSide::Port,
Side::Right => PortSide::Starboard,
}
}
}
#[cfg(universe = "mirror")]
impl From<Side> for PortSide {
fn from(s: Side) -> PortSide {
match s {
Side::Left => PortSide::Starboard,
Side::Right => PortSide::Port,
}
}
}
Кроме того, я бы посоветовал вам не требуется возможность быть определены , но вместо этого разрешить поведение по умолчанию при отсутствии этой функции. В вашем случае «нормальный» кажется, что это должно быть поведение по умолчанию.
Да, я пытаюсь создать псевдонимы. У Rust уже есть псевдонимы типов без проблем. Можете ли вы привести пример того, как поддержка псевдонимов вариантов перечисления может сломать что-то, потому что я не вижу ничего. – Timmmm
@Timmmm: Проблема заключается в сопоставлении с образцом. Какой рычаг берется в случае, если у вас есть совпадение x {One => {}, Two => {}} '? –
Это не проблема. Он будет вести себя точно так, как если бы вы написали «match x {One => {}, One => {}}', т. Е. Распечатали ошибку. (Ошибка, которую он на самом деле печатает, это 'Это недостижимый шаблон'.) – Timmmm