Как я могу определить пред/постинкремент поведение в объектах Perl?

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

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

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

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

14
задан Zaid 3 May 2010 в 19:17
поделиться

2 ответа

Вы хотите перегрузить .

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
12
ответ дан 1 December 2019 в 13:21
поделиться

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

package SomeThing;

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

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

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

7
ответ дан 1 December 2019 в 13:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: