Как Perl 6 оценивает правдоподобие?

Многие объяснения уже присутствуют, чтобы объяснить, как это происходит и как это исправить, но вы также должны следовать рекомендациям, чтобы избежать 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).

26
задан Elizabeth Mattijsen 27 November 2019 в 19:18
поделиться

5 ответов

Таким образом для объединения то, что я думаю, чтобы быть лучшим из общих ответов:

при оценке переменной в булевом контексте, его .true () метод называют. Значение по умолчанию .true () метод, используемый объектом, делает Perl < с 5 стилями; 0, "", undef> проверка значения объекта, но когда Вы говорите, "но Верный" или, "но Ложь", этот метод переопределяется с тем, который не смотрит на значение просто, возвращает константу.

Каждый мог мыслимая запись истинное () метод, который, скажем, возвратил true, когда значение было даже и ложь, когда это было нечетно.

3
ответ дан brian d foy 28 November 2019 в 07:08
поделиться

Perl 6 оценивает истину теперь путем задавания объекту вопроса вместо того, чтобы смотреть на его значение. Значение не является объектом. Это - что-то, что я любил о других объективных языках и буду рад иметь в Perl: Я добираюсь, чтобы решить, как объект отвечает и может видоизменить это. Как ysth сказал, Вы могли сделать это в Perl 5 с перегрузкой, но я всегда чувствую, что должен промыть руки после выполнения его тот путь.:)

, Если Вы не делаете ничего для изменения этого, Perl 6 ведет себя таким же образом как Perl 5, таким образом, Вы получаете наименьшее количество суммы удивления.

17
ответ дан Andrew Grimm 28 November 2019 в 07:08
поделиться

Тест Truthness просто звонит .true метод на объекте, таким образом, "соединение в" операции $stuff but True просто (среди прочего) переопределения тот метод.

Это определяется в S02, обычно перечислимые типы (которых Bool - один), описаны в S12.

11
ответ дан moritz 28 November 2019 в 07:08
поделиться

См. Резюме 12: Роли .

правила являются тем же, но, "но" копирует 0 и применяет роль к копии, которая заставляет его быть верным в булевом контексте.

можно сделать то же самое с перегрузкой в Perl 5.

11
ответ дан brian d foy 28 November 2019 в 07:08
поделиться

По словам O'Reilly Perl 6 и Основы Попугая , ложь 0, undef, пустая строка, и оценивает отмеченный как ложь . верный все остальное.

кроме того, Perl 6 имеет и примитивный булев тип и при наличии Истины и лжи роли , который любое значение может смешать в (таким образом, у Вас может быть "0, но Истинное" значение или "1, но Ложь" один, например, или ложный список, содержащий элементы или истинный список, это пусто).

См. http://www.mail-archive.com/macosx@perl.org/msg09930.html

6
ответ дан brian d foy 28 November 2019 в 07:08
поделиться