Зачем Rust, если в выражениях let используется оператор присваивания вместо оператора равенства? - PullRequest
1 голос
/ 21 сентября 2019

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

Первая деталь - использование оператора присваивания вместо сравнения, а вторая - размещение операндов.

Например:

    let a = Some(5);

    if let Some(i) = a {
        println!("Hello, {}!", i);
    }

Inмоя голова становится более «разборчивой» таким образом:

    if let Some(i) == a {
        println!("Hello, {}!", i);
    }

или даже лучше:


    if let a == Some(i) {
        println!("Hello, {}!", i);
    }

Может ли кто-нибудь помочь мне понять, что стоит за этим?

1 Ответ

7 голосов
/ 21 сентября 2019

Синтаксис Rust

let Some(i) = a

, потому что мы создаем новую переменную i и инициализируем ее обернутым значением в a.Оператор = предназначен для создания новых переменных.У вас есть шаблон с левой стороны, а выражение справа.Все переменные слева в шаблоне инициализируются на основе соответствующих значений в выражении справа.

Оператор сравнения == здесь не имеет смысла.Сказать, что

let Some(i) == a

, похоже, возвращает ли выражение

let Some(i)

равное выражению

a

При использовании == вы ожидаете левоеи правые части будут полными выражениями, которые уже имеют значения, и вы возвращаете, равны ли они.Но это не то, что мы делаем, если позволим.Когда мы используем if-let, мы создаем новую переменную.== имеет смысл только тогда, когда можно вычислить выражения с обеих сторон.

Аналогично, выражение

let a == Some(i)

довольно странно, поскольку a уже существует.Мы, конечно, не создаем новую переменную a.И тот же аргумент против использования ==, как и раньше, применяется, поскольку i еще не существует.

В итоге мы используем = при создании новой переменной и == для проверки равенства выражений(которые, если в них есть переменные, такие переменные уже должны существовать).

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