Как новичок в Rust, я наткнулся на два, по-видимому, действительных способа запуска match
на ссылочном типе. Предположим, что я определил enum Color { Red, Yellow, Green, Teal, Blue, Purple }
, и я хочу реализовать функцию, которая работает на ссылке &self
экземпляра этого перечисления.Должно ли & быть разыменовано до того, как оно будет сопоставлено?
Я вижу два пути, чтобы написать такую функцию:
impl Color {
// Approach #1: Match the reference, using references in each pattern
fn contains_red(&self) -> bool {
match self {
&Color::Red => true,
&Color::Yellow => true,
&Color::Purple => true,
_ => false,
}
}
// Approach #2: Dereference &self and match the patterns directly
fn contains_blue(&self) -> bool {
match *self {
Color::Blue => true,
Color::Teal => true,
Color::Purple => true,
_ => false,
}
}
}
Изначально я ожидал, что разыменования &self
будет учитываться как движение, и может вызвать ошибки, если я назвал color.contains_blue()
на тот же экземпляр дважды в строка, но это, похоже, не так.
Являются ли эти подходы функционально идентичными? Кто-нибудь из них сломается, если я буду сопоставлять более сложные объекты?
Мне сказали разыгрывать аргумент соответствия (ваш подход №2), поскольку он более идиоматичен, потому что он имеет меньше беспорядка. Надеюсь, кто-то сможет ответить на более авторитетный ответ. :-) – Shepmaster
Просто, чтобы убедиться: 'Цвет' не' Копия', правильно? –
@Matthieu Nope, это определено как показано выше, без атрибутов. Но если это существенно повлияет на поведение, я бы хотел услышать об этом. – KChaloux