Ответ 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
.
- ⟨First_param⟩:
- ⟨Args⟩: список из двух аргументов со встроенным комментарием
/**/
между ними:⟨first_arg⟩/**/, ⟨second_arg⟩
- ⟨First_arg⟩:
(&*"\\", '@')
. Это просто 2-кортеж, где первый элемент представляет собой строку, содержащую обратную косую черту, а вторая - char'@'
.&*
Для первого элемента отменяется. - ⟨Second_arg⟩:
{}
. Это пустой блок, который имеет тип()
. Так как второй аргумент, единица передается.
- ⟨First_arg⟩:
- ⟨Closure⟩: определение закрытия
- ⟨Rhs⟩: скошенный блок с одним утверждением внутри:
{ ⟨stmt⟩; }
{ ⟨stmt⟩; }
. Обратите внимание, что это утверждение с точкой с запятой. Это означает, что результат не возвращается из блока. Вместо этого блок возвращает()
же, как пустой блок{}
.- ⟨Stmt⟩: выражение для индексирования
{ &⟨collection⟩[⟨index⟩] }
.- ⟨Collection⟩:
[..=..]
. Это массив с одним элементом. Элемент is..=..
который являетсяRangeToInclusive
гдеend
диапазона - этоRangeFull
написанный..
- ⟨Index⟩:
..
Это сноваRangeFull
.
- ⟨Collection⟩:
- ⟨Stmt⟩: выражение для индексирования
- ⟨Lhs⟩: вызов функции замыкания
- Сравнение через
Итак, в итоге: мы сравниваем результат вызова замыкания на скошенный блок, который вычисляет значение ()
. Закрытие в основном |_, x| x
|_, x| x
и второй аргумент, который мы передаем ему, - это {}
(который оценивает ()
), поэтому выражение выражения закрытия закрытия вычисляется как ()
.
Это означает, что все это эквивалентно:
-
let val = !(() ==() );
, что эквивалентно: -
let val = !( true );
, что эквивалентно: -
let val = false;