Как определить поведение до / после приращения в объектах Perl? - PullRequest
14 голосов
/ 03 мая 2010

Date::Simple объекты отображают это поведение, где $date++ возвращает дату следующего дня.

Date :: Простые объекты являются неизменяемыми.После назначения $ date1 для $ date2, никакие изменения в $ date1 не могут повлиять на $ date2.Это означает, например, что нет ничего похожего на операцию set_year, и $ date ++ назначает новый объект в $ date .

Как можноПользовательское определение до / постинкрементного поведения объекта, так что ++$object или $object-- выполняет определенное действие?

Я пролистал perlboot , perltoot , perltooc и perlbot , но я не вижу примеров, показывающих, как это можно сделать.

Ответы [ 2 ]

12 голосов
/ 03 мая 2010

Вы хотите overload.

package Number;

use overload
    '0+'    => \&as_number,
    '++'    => \&incr,
;

sub new {
    my ($class, $num) = @_;

    return bless \$num => $class;
}

sub as_number {
    my ($self) = @_;

    return $$self;
}

sub incr {
    my ($self) = @_;

    $_[0] = Number->new($self->as_number + 1); # note the modification of $_[0]
    return;
}

package main;

my $num = Number->new(5);
print $num      . "\n"; # 5
print $num++    . "\n"; # 5
print ++$num    . "\n"; # 7
7 голосов
/ 03 мая 2010

Если вы посмотрите вверх perlfaq7 , вы обнаружите, что ответом является использование прагмы overload , хотя они, вероятно, могли бы дать вопросу FAQ более подходящее имя (на мой взгляд ).

package SomeThing;

use overload
  '+' => \&myadd,
  '-' => \&mysub;

В основном (при условии, что $a является объектом класса SomeThing, а $b нет), вышеприведенное перегрузит $a + $b на $a->myadd($b, 0) и $b + $a на $a->myadd($b, 1) (то есть третий аргумент - логическое значение, означающее, что «аргументы этого оператора перевернуты» и синтаксис «первый аргумент сам» сохраняется), и то же самое для - и mysub.

Прочитайте документацию для полного объяснения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...