Каково соглашение со всем другим Perl 6 операторов равенства? (==, ===, eq, eqv, ~~, =: =, …)

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать NullPointerException вообще.

См. также: A хороший список лучших практик

Я бы добавил, очень важно, хорошо использовать модификатор final. Использование "окончательной" модификатор, когда это применимо в Java

Сводка:

  1. Используйте модификатор final для обеспечения хорошей инициализации.
  2. Избегайте возврата null в методы, например, при возврате пустых коллекций.
  3. Использовать аннотации @NotNull и @Nullable
  4. Быстрое завершение работы и использование утверждений, чтобы избежать распространения нулевых объектов через все приложение, когда они не должен быть пустым.
  5. Сначала используйте значения с известным объектом: if("knownObject".equals(unknownObject)
  6. Предпочитают valueOf() поверх toString ().
  7. Используйте null safe StringUtils StringUtils.isEmpty(null).

38
задан Pat 5 November 2018 в 17:15
поделиться

4 ответа

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

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 regex, это - соответствие regex - и так далее.

38
ответ дан moritz 27 November 2019 в 03:28
поделиться
21
ответ дан Randy 27 November 2019 в 03:28
поделиться

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

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

В одном из комментариев, Вы спрашиваете [приблизительно 110] и 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 , чем, квалификация e , greater, чем) cmp со строковой семантикой. Это определяется как Perl 6 ~$a cmp ~$b, где ~ новая "строка contextualizer", который вызывает строковую семантику. С [1 110], Вы всегда делаете сравнение строк, точно так же, как старый Perl 5 cmp.

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

16
ответ дан raiph 27 November 2019 в 03:28
поделиться

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

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

3
ответ дан 27 November 2019 в 03:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: