Можно ли сравнить с результатом `const fn`? - PullRequest
0 голосов
/ 11 января 2019

Я пробовал наивный подход

fn main() -> Result<(), Box<std::error::Error>> {
    let num = 0;
    match num {
        u64::max_value() => println!("Is u64::max_value()"),
        _ => println!("Is boring")
    }
    Ok(())
}

, но не получается с expected tuple struct/variant, found method <u64>::max_value.

Есть ли другой синтаксис, кроме n if n == u64::max_value() => ..., который я могу использовать?

1 Ответ

0 голосов
/ 11 января 2019

Левая часть => должна быть шаблоном, и несколько выражений также являются допустимыми шаблонами, что не относится к выражению вызова. Однако именованные константы могут быть сопоставлены, поэтому вы можете сделать это:

fn main() -> Result<(), Box<std::error::Error>> {
    let num = 0;

    const MAX: u64 = u64::max_value();
    match num {
        MAX => println!("Is u64::max_value()"),
        _ => println!("Is boring")
    }
    Ok(())
}

Ссылка на игровую площадку

Это также имеет преимущество, позволяющее компилятору проверять, является ли ваше сопоставление исчерпывающим (какие паттерны не ):

const fn true_fn() -> bool { true }

fn main() -> Result<(), Box<std::error::Error>> {
    let num = true;

    const TRUE: bool = true_fn();
    match num {
        TRUE => println!("Is u64::max_value()"),
        false => println!("Is boring")
    }
    Ok(())
}

Ссылка на игровую площадку

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