Данный пост является вырезкой из документации Perl6::Perl5::Differences
Перегрузка
Как встроенные функции, так и операторы являются перегружаемыми подпрограммами
и методами [ или мультиподпрограммами и мультиметодами от анг. multi subs and methods],
изменение их поведения к определенному типу решается добавлением соответствующих
мультиподпрограмм и мультиметодов. Если вы желаете,
чтобы данные подпрограммы были доступны глобально, то их нужно установить в
область видимости GLOBAL:
multi sub GLOBAL::uc(RussianStr $str, Int $i) { ... } # "перегрузка" оператора объединения строк: multi sub infix:<~>(Str $us, RussianStr $them) { ... }
Чтобы осуществить приведение типа (т.е значение одного типа преобразовать в другому), можно просто создать метод с именем типа данных, к которому нужно привести значение.
sub needs_bar(Bar $x) { ... } class Foo { ...
# приведение к типу Bar: method Bar { ... } }
needs_bar(Foo.new); # передача подпрограмме объекта типа Bar
Cемантика списка и хэша
Для того, чтобы написать класс, чьи объекты могут быть отнесены к переменным
с сигилом @, нужно реализовать позиционные роли.
Аналогично для сигила % нужно реализовать ассоциативную роль.
Сигил & подразумевает фрагмент кода, который может быть вызван.
Роли обеспечиваются операторами postcircumfix:<[ ]> ( позиционный, для
индексировании массива), postcircumfix: <{ }> (ассоциативный) и
postcircumfix:<()> (вызываемый фрагмент кода).
Технически это обычные методы с причудливым синтаксисом. Нужно только
подкорректировать их для выражения соответствующей семантики.
class OrderedHash does Associative { method postcircumfix:<{}>(Int $index) { # здесь код, оперирующий отдельными элементами хэша } method postcircumfix:<{}>(**@slice) { # здесь код, оперирующий срезами хэша } ... } my %orderedHash = OrderedHash.new(); say %orderedHash{'a'};
См. подробнее в спецификации [S13]
Изменения в семантике операторов тестирования файлов
Было: if (-r $file && -x _) { ... } Стало: if $file ~~ :r & :x { ... }
Операторы тестирования файлов теперь возвращают в качестве результата булево значение. Детальнее об этом см. [S03]: Изменения в операторах Perl
Leave a comment