2008-09-24 3 views
23

Читая о Perl 6, я вижу особенность быть трубили о том, где вы больше не должны делать:Как Perl 6 оценивает правдивость?

return "0 but true"; 

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

return 0 but True; 

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

Каковы правила в Perl 6, когда дело доходит до булевого контекста?

+1

в Perl 5 является общим для использования «0E0», как «нулевое, но верно» возвращаемое значение – EvdB 2008-09-24 12:33:27

+8

I «Я дам вам преимущество для использования« правдивости »в техническом вопросе :) – 2008-10-08 07:13:26

+1

@PaulDixon: этот термин также используется в сообществе Ruby. – 2011-12-09 05:59:04

ответ

3

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

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

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

6

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

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

См http://www.mail-archive.com/[email protected]/msg09930.html

+2

Эта книга древняя и не отражает текущее состояние языка. – 2008-10-08 07:11:49

11

См Synopsis 12: Roles.

Правила те же, но «но» копирует 0 и применяет роль к копии, которая вызывает ее истинность в булевом контексте.

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

+1

Er, разве вы не имеете в виду «true в булевом контексте»? – Ovid 2008-09-24 12:18:57

15

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

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

11

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

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

1

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

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

|| = идиома затерта некоторые строки я на самом деле не ожидал:

$ perl -e '$x = "0"; $x ||= ""; print ">>$x<<\n";' 
>><< 
Смежные вопросы