Каковы истинные и ложные значения в Perl 6?

Хотя всегда можно использовать миксины или переопределения методов для изменения приведения Bool, по умолчанию какие значения считаются достоверными, а какие значения считаются ложными?

Примечание: этот вопрос был задан ранее, но, к сожалению, он настолько старый, что его содержание полностью устарело и бесполезно для современного Perl 6.

Ответы

Ответ 1

Истинных значений не существует, поскольку каждый тип решает сам с помощью метода .Bool, который вызывается в логических контекстах. Для встроенных типов следующее возвращает False, когда вызывается их метод .Bool.

  • 0 (кроме Rat из x/0, где x≠0)
  • Пустой список/типы коллекций (Список, Массив, Хэш, Карта, Набор, Сумка и т.д.)
  • Пустая строка
  • Failure
  • Promise до того, как его оставили/сломали.
  • StrDistance, чьи до и после одинаковы.
  • Junction, когда вы этого ожидаете.
  • Тип объектов
  • Ноль (технически тип объекта)
  • Любое неопределенное значение (объекты с технической точки зрения)

В противном случае любое определенное значение по умолчанию возвращает True, когда вызывается его метод .Bool. Это включает в себя Str '0', NaN и диапазон нулевой длины (0^..^0), которые в других языках могут быть неверными.

Этот ответ предназначен для краткого ознакомления. Смотрите этот ответ для более подробного обсуждения.

Ответ 2

TL; DR Этот ответ представляет собой исчерпывающее резюме на основе соответствующего документа. 1

  • Базовый случай 2 - это True для определенного объекта (экземпляра) и False для неопределенного (объекта типа).

  • Численно значения 0 или 0/0 равны False. (Но Rational с ненулевым числителем, например 1/0 - это True, а (0/0).Num (который оценивается как NaN) - это True.)

  • Пустая коллекция (List, Hash, Set, Buf и т.д.) - False.

  • Пустая строка (например, литерал "") - False. (NB. "0", "0.0" и т.д. Являются True.)

  • Определенным Failure является False.

  • Определенным Promise является False, пока его статус не станет Kept/Broken.

  • Определенным StrDistance является False, если преобразование строки, которое он представляет, не оказало влияния на преобразовываемую строку.

  • Определенное значение Junction равно True или False в зависимости от типа соединения и значений True/False его элементов.

Сноски

1 Я написал первый элемент маркера, основываясь только на том, что он знал, что это правда, потому что он имеет фундаментальное значение для P6, а также подтвердил его, проверив код компилятора. 2 Другие пункты списка суммируют содержимое на момент написания этого ответа страница документа .Bool, в этот момент она перечислила 20 типов. Если последняя страница была неполной, то этот ответ является неполным.

2 Базовый случай можно увидеть, взглянув на код реализации Rakudo, в частности ядро Mu.pm6. Смотрите мой ответ на аналогичную SO для соответствующих ссылок кода.