39. 0 but True в Perl 6

В Perl 5 был стандартный прием, когда из нуля требовалось сделать логическую истину:

# Perl 5
my $value = '0 but true';
say 2 + $value;     # 2
say 'OK' if $value; # OK

В Perl 6 такие трюки можно делать без привлечения строк — для этого есть инфиксный оператор but:

my $v = 0 but True;
say $v;  # 0
say ?$v; # True

Этот оператор подмешивает к объекту метод, имя которого совпадает с типом значения. В данном примере True это Bool, поэтому переменная $v получает метод Bool, возвращающий True. Теперь в булевом контексте (явно или неявно) переменная окажется истиной, хотя ее числовое значение продолжает быть нулем.

Аналогично можно подмешивать другие типы. Например, сказать, что число пи в виде строки это «примерно три»:

my $p = pi but 'примерно три';
say 0 + $p;
say "Значение равно $p";

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

3.14159265358979
Значение равно примерно три

Нужно быть осторожным, если потребуется вывести значение с помощью метода perl. В текущей реализации это не работает, и альтернативное значение теряется:

$ perl6 -e'(0 but True).perl.say'
0

Я предложил вариант решения этой проблемы, посмотрим, что скажут основные разработчики.

2 thoughts on “39. 0 but True в Perl 6

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s