Что делает эта странная линия?

Запрос на перенос был выполнен с новым тестом для компилятора Rust. Он проверяет, может ли странная строка компилироваться:

fn main() {
    let val = !((|(..):(_,_),[email protected]_|__)((&*"\\",'@')/**/,{})=={&[..=..][..];})//
    ;
    assert!(!val);
}

Что делает эта линия в точности?

Ответы

Ответ 1

Пусть сломает! Во-первых, я переформатировал линию, чтобы несколько увеличить "удобочитаемость".

let val = !(
    (
        |(..): (_, _), [email protected]_| __
    )(
        (
            &*"\\", 
            '@'
        ) /**/, 
        {}
    )
    ==
    {
        &[..=..][..];
    }
)//
;

Он начинается с let val = и заканчивается //<newline>; , Таким образом, это простая let-связывание формы let val = ⟨v⟩; , Давайте обсудим, что делает ⟨v⟩:

  • Отрицание через не-оператор !( ⟨_⟩ )
    • Сравнение через ==: ⟨lhs⟩ == ⟨rhs⟩
      • ⟨Lhs⟩: вызов функции замыкания ( ⟨closure⟩ )( ⟨args⟩ )
        • ⟨Closure⟩: определение закрытия |⟨first_param⟩, ⟨second_param⟩| ⟨body⟩ |⟨first_param⟩, ⟨second_param⟩| ⟨body⟩
          • ⟨First_param⟩: (..): (_, _). Этот параметр имеет аннотацию типа (_, _) что означает, что это 2-кортеж. Шаблон (где обычно вы найдете одно имя) (..) что означает: кортеж, но игнорировать все его элементы.
          • ⟨Second_param⟩: [email protected]_. Это шаблон, обычно известный из привязок соответствия: name @pattern. Таким образом, фактический шаблон равен _ (который ничего не связывает), и значение привязывается через @ к имени __ (два @ подчеркивания, который является своего рода допустимым идентификатором).
          • ⟨Body⟩: __. Это просто идентификатор, которым мы привязываем второй параметр. Таким образом, замыкание в основном эквивалентно |_, x| x |_, x| x.
        • ⟨Args⟩: список из двух аргументов со встроенным комментарием /**/ между ними: ⟨first_arg⟩/**/, ⟨second_arg⟩
          • ⟨First_arg⟩: (&*"\\", '@'). Это просто 2-кортеж, где первый элемент представляет собой строку, содержащую обратную косую черту, а вторая - char '@'. &* Для первого элемента отменяется.
          • ⟨Second_arg⟩: {}. Это пустой блок, который имеет тип (). Так как второй аргумент, единица передается.
      • ⟨Rhs⟩: скошенный блок с одним утверждением внутри: { ⟨stmt⟩; } { ⟨stmt⟩; }. Обратите внимание, что это утверждение с точкой с запятой. Это означает, что результат не возвращается из блока. Вместо этого блок возвращает () же, как пустой блок {}.
        • ⟨Stmt⟩: выражение для индексирования { &⟨collection⟩[⟨index⟩] }.
          • ⟨Collection⟩: [..=..]. Это массив с одним элементом. Элемент is ..=.. который является RangeToInclusive где end диапазона - это RangeFull написанный ..
          • ⟨Index⟩: .. Это снова RangeFull.

Итак, в итоге: мы сравниваем результат вызова замыкания на скошенный блок, который вычисляет значение (). Закрытие в основном |_, x| x |_, x| x и второй аргумент, который мы передаем ему, - это {} (который оценивает ()), поэтому выражение выражения закрытия закрытия вычисляется как ().

Это означает, что все это эквивалентно:

  • let val = !(() ==() ); , что эквивалентно:
  • let val = !( true ); , что эквивалентно:
  • let val = false;