Как обстоят дела со всеми различными операторами равенства Perl 6? (==, ===, eq, eqv, ~~, =: =, ...) - PullRequest
38 голосов
/ 07 октября 2008

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

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

Ответы [ 4 ]

38 голосов
/ 07 октября 2008

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

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 является регулярным выражением, это совпадение с регулярным выражением - и т. Д.

21 голосов
/ 07 октября 2008
15 голосов
/ 07 октября 2008

Сводка в Синопсис 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 than, e qual, g reater than) равно cmp с семантикой строки. Он определен как Perl 6 ~$a cmp ~$b, где ~ - это новый «string contextualizer», который вызывает семантику строк. С leg вы всегда проводите сравнение строк, как старый Perl 5 cmp.

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

3 голосов
/ 14 апреля 2010

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

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

...