Подтвердить что ты не робот

Какая сделка со всеми различными операторами равенства Perl 6? (==, ===, eq, eqv, ~~, =: =,...)

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

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

4b9b3361

Ответ 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.

Наконец ~~ является "умным совпадением", он отвечает на вопрос "does $x match $y". Если $y является типом, он проверяет тип. Если $y является регулярным выражением, оно соответствует регулярному выражению - и т.д.

Ответ 3

Содержит ли сводка в Синопсис 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 than) является cmp со строковой семантикой. Он определен как Perl 6 ~$a cmp ~$b, где ~ - это новый "контекстуализатор строк", который заставляет семантику строк. С leg вы всегда выполняете сравнение строк, как и старый Perl 5 cmp.

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