Как Perl 6 оценивает правдивость? - PullRequest
26 голосов
/ 24 сентября 2008

Читая о Perl 6, я вижу, как о трубе, о которой вам больше не нужно делать:

return "0 but true";

... но вместо этого можно сделать:

return 0 but True;

Если это так, как работает истина в Perl 6? В Perl 5 это было довольно просто: 0, "" и undef ложные, все остальное верно.

Каковы правила в Perl 6, когда речь идет о логическом контексте?

Ответы [ 6 ]

16 голосов
/ 24 сентября 2008

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

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

11 голосов
/ 24 сентября 2008

Проверка на истинность просто вызывает метод .true для объекта, поэтому операция "mix in" $stuff but True просто (помимо прочего) переопределяет этот метод.

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

11 голосов
/ 24 сентября 2008

См. Конспект 12: Роли .

Правила те же, но «но» копирует 0 и применяет к копии роль, которая делает ее истинной в логическом контексте.

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

6 голосов
/ 24 сентября 2008

Согласно Perl 6 и Parrot Essentials О'Рейли , false равно 0, undef, пустая строка и значения, помеченные как false . true - это все остальное.

Кроме того, Perl 6 имеет как примитивный логический тип, так и с True и False ролями , с которыми может смешиваться любое значение (поэтому вы можете иметь значение «0, но True» или «1, но False» msgstr "один, например, или ложный список, содержащий элементы, или истинный список, который пуст).

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

3 голосов
/ 24 сентября 2008

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

Когда вы оцениваете переменную в логическом контексте, вызывается ее метод .true (). Метод .true () по умолчанию, используемый объектом, выполняет проверку значения объекта в стиле <0, "", undef> в Perl, но когда вы говорите "но True" или "но False", этот метод переопределяется с помощью тот, который не смотрит на значение, просто возвращает константу.

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

1 голос
/ 02 мая 2014

Одно ложное значение, которое почти везде игнорируется, - "0". Недавно я сделал это болезненное открытие, что «0» - это false в PERL 5. Гы. Непустая строка, которая является ложной. Я действительно надеялся, что это изменится в PERL6, но я думаю, что нет.

> if ( "0" ) { say "True" } else { say "False" }
False

Идиома || = перекрыла некоторые строки, которых я действительно не ожидал:

$ perl -e '$x = "0"; $x ||= ""; print ">>$x<<\n";'
>><<
...