Почему выражение соответствия с неизвестным идентификатором компилируется и запускается? - PullRequest
0 голосов
/ 24 ноября 2018

Я ожидаю, что компилятор Rust будет жаловаться на пропущенные случаи в совпадении, а также на неизвестный идентификатор:

pub enum MyEnum {
    Case1,
    Case2,
}

impl MyEnum {
    fn my_func(&self) {
        match self {
            _whatever_string => println!("Why am I printed ?"),
        }
    }
}

fn main() {
    let x = MyEnum::Case1;
    x.my_func();
}

Почему он компилируется и вызывает println?

1 Ответ

0 голосов
/ 24 ноября 2018

Ваш пример является частным случаем чего-то объясненного здесь :

let x = 5;

let number = match x {
    1 => "one",
    2 => "two",
    3 => "three",
    4 => "four",
    5 => "five",
    _ => "something else",
};

Рассмотрим последний случай (_), который соответствует чему-то, что не упоминалось ранее.Компилятор не жалуется на пропущенные случаи (поскольку «все остальное» включено в последнюю ветвь).

Ваш пример по сути такой же: A match с одной единственной рукой, которая покрывает все.Вы могли бы также написать _ вместо _whatever_string или другой идентификатор - который затем мог бы использоваться в соответствующем плече.

Таким образом, этот match просто сопоставляет и выполняет операторы в своем единственном плече.,Компилятор видит, что одна ветка покрывает все, и не нужно жаловаться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...