How can I define pre/post-increment behavior in Perl objects?
Date::Simple
objects display this behavior, where $date++
returns the next day's date.
Date::Simple objects are immutable. After assigning $date1 to $date2, no change to $date1 can affect $date2. This means, for example, that there is nothing like a set_year operation, and $date++ assigns a new object to $date.
How can one custom-define the pre/post-incremental behavior of an object, such that ++$object
or $object--
performs a particular action?
I've skimmed over perlboot, perlt开发者_运维知识库oot, perltooc and perlbot, but I don't see any examples showing how this can be done.
You want 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
If you look up perlfaq7 you'll find that the answer is to use the overload pragma, though they probably could have given the FAQ question a better name (in my opinion).
package SomeThing;
use overload
'+' => \&myadd,
'-' => \&mysub;
Basically (assuming $a
is an object of the SomeThing
class and $b
isn't), the above would overload $a + $b
to be $a->myadd($b, 0)
and $b + $a
to $a->myadd($b, 1)
(that is, the third argument is a boolean meaning "were the arguments to this operator flipped" and the first-argument-is-self syntax is preserved), and the same for -
and mysub
.
Read the documentation for the full explanation.
精彩评论