В чем дело со всеми различными операторами равенства Perl 6? ( = = , ===, эквалайзер, эквалайзер, ~~, =:=, …)

#operators #raku

Вопрос:

В Perl 6, похоже, наблюдается взрыв операторов равенства. Что такое =:= ? В чем разница между leg и cmp ? Или eqv и === ?

У кого-нибудь есть хорошее резюме?

Комментарии:

1. Знаете ли вы, что ... это также допустимый оператор?

2. Почему существует страх сложности? Вам не нужно использовать все функции. Просто научись тому, что тебе нужно.

Ответ №1:

=:= проверяет, являются ли два контейнера (переменные или элементы массивов или хэшей) псевдонимами, т. е., если один изменяется, изменяется ли также и другой?

 my $x;
my @a = 1, 2, 3;
# $x =:= @a[0] is false
$x := @a[0];
# now $x == 1, and $x =:= @a[0] is true
$x = 4;
# now @a is 4, 2, 3 
 

Что касается других: === тесты, если две ссылки указывают на один и тот же объект, и тесты eqv, если две вещи структурно эквивалентны. Так [1, 2, 3] === [1, 2, 3] что будет ложно (не тот же массив), но [1, 2, 3] eqv [1, 2, 3] будет истинно (та же структура).

leg сравнивает строки , подобные Perl 5 cmp , в то время как Perl 6 cmp умнее и будет сравнивать числа, подобные <=> и строки, подобные leg .

 13 leg 4   # -1, because 1 is smaller than 4, and leg converts to string
13 cmp 4   #  1, because both are numbers, so use numeric comparison.
 

Наконец ~~ , это «умное совпадение», оно отвечает на вопрос « $x совпадает $y ли «. Если $y это тип, то это проверка типа. Если $y это регулярное выражение, то оно совпадает с регулярным выражением — и так далее.

Комментарии:

1. В Perl 5 нет «эквалайзера». Я думаю, что вы имели в виду «cmp» там.

Ответ №2:

Делает ли краткое изложение в Синопсисе 3: Семантика сравнения то, что вы хотите, или вы уже читали это? Документы по дизайну ссылаются на файлы тестов, в которых используются эти функции, поэтому вы можете увидеть примеры их использования и текущее состояние тестирования.

Операторы сравнения Perl 6 гораздо больше подходят для динамического языка и всего, что происходит. Вместо того, чтобы просто сравнивать строки или числа (или превращать вещи в строки или числа), теперь вы можете точно проверять вещи с помощью оператора, который делает то, что вы хотите. Вы можете проверить значение, контейнер, тип и так далее.

В одном из комментариев вы спрашиваете об eqv И. cmp В старые времена Perl 5 cmp был для сортировки и возвращал одно из трех магических значений (-1,0,1), и он всегда делал это со строковой семантикой. В Perl 6 cmp возвращает один из трех типов Order объектов, поэтому вам не нужно запоминать, что означает -1, 0 или 1. Кроме того, новое cmp не навязывает семантику строк, поэтому оно может быть более умным при передаче чисел (в отличие от Perl 5, которые сортируются следующим образом 1, 10, 11, 2, 20, 21 …).

leg (l ess чем, e qual, g reater чем) cmp имеет строковую семантику. Он определен как Perl 6 ~$a cmp ~$b , где ~ находится новый «контекстуализатор строк», который определяет семантику строк. С leg помощью вы всегда выполняете сравнение строк, как в старом Perl 5 cmp .

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

Ответ №3:

Это также удобное справочное руководство:

Периодическая таблица операторов Perl6

Комментарии:

1. Этот отпечаток, хотя и прекрасный, не соответствует текущей версии спецификации, Perl 6.c

2. @Coke ну, это было написано еще в 2010 году, но ответчик все еще активный пользователь, поэтому я хотел бы, чтобы они обновили его

3. @tac ответ помечен как «вики-сообщество», поэтому его может редактировать любой желающий. Или вы можете уточнить в комментарии, какое обновление вы ожидаете.

4. @Ether Я в основном отвечал на Coke; Я не ожидаю такого обновления

5. Периодическая таблица операторов была составлена добровольцем, который, насколько мне известно, уже некоторое время не проявлял активности. Я рекомендую использовать docs.perl6.org для реальных справочных вопросов.