Перевод официальной документации Perl 6.

Отличия между Perl 5 и Perl 6 ( Перегрузка )

| 0 Comments | 0 TrackBacks

Данный пост является вырезкой из документации 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

No TrackBacks

TrackBack URL: http://blog.perl6doc.ru/mt-tb.cgi/38

Leave a comment

About this Entry

This page contains a single entry by Dinar published on October 16, 2010 4:55 PM.

Отличия между Perl 5 и Perl 6 ( Объекты ) was the previous entry in this blog.

Отличия между Perl 5 и Perl 6 (встроенные функции) is the next entry in this blog.

Find recent content on the main index or look in the archives to find all content.