Date::Simple
объекты отображают это поведение, где $date++
возвращает дату следующего дня.
Дата:: Простые объекты неизменны. После присвоения $date1 к $date2 никакое изменение в $date1 не может влиять на $date2. Это означает, например, что нет ничего как set_year операция, и $date ++ присваивает новый объект $date.
Как может одно пользовательское - определять пред/поствозрастающий поведение объекта, такого что ++$object
или $object--
выполняет конкретное действие?
Я скользил по perlboot, perltoot, perltooc и perlbot, но я не вижу, что любые примеры показывают, как это может быть сделано.
Вы хотите перегрузить
.
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
Если вы посмотрите 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
.
Прочтите документацию для полного объяснения.