Каковы истинные и ложные значения в 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 для соответствующих ссылок кода.