Perl 6, похоже, имеет взрыв операторов равенства. Что такое =:=
? Какая разница между leg
и cmp
? Или eqv
и ===
?
Есть ли у кого-нибудь хорошее резюме?
Perl 6, похоже, имеет взрыв операторов равенства. Что такое =:=
? Какая разница между leg
и cmp
? Или eqv
и ===
?
Есть ли у кого-нибудь хорошее резюме?
=: = проверяет, сглажены ли два контейнера (переменные или элементы массивов или хэшей), т.е. если они меняются, также изменить?
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
является регулярным выражением, оно соответствует регулярному выражению - и т.д.
Из reddit today:
Содержит ли сводка в Синопсис 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
.
Если у вас все еще есть вопросы к другим операторам, позвольте разбить их на отдельные вопросы.:)
Это также удобный справочник: