如何在Perl对象中定义前/后增量行为?

时间:2010-05-03 05:59:35

标签: perl object decrement

Date::Simple个对象会显示此行为,其中$date++会返回第二天的日期。

  

Date ::简单对象是不可变的。将$ date1分配给$ date2后,$ date1的更改不会影响$ date2。这意味着,例如,没有像set_year操作, $ date ++将新对象分配给$ date

如何自定义对象的前/后增量行为,以便++$object$object--执行特定操作?

我已经浏览了perlbootperltootperltoocperlbot,但我没有看到任何示例说明如何做到这一点。

2 个答案:

答案 0 :(得分:12)

你想要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

答案 1 :(得分:7)

如果你查找perlfaq7,你会发现答案是使用overload编译指示,尽管他们可能会给常见问题提供一个更好的名称(在我看来)。

package SomeThing;

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

基本上(假设$aSomeThing类的对象而$b不是),上面会将$a + $b重载为$a->myadd($b, 0)并且$b + $a$a->myadd($b, 1)(也就是说,第三个参数是一个布尔意思是“这个运算符的参数被翻转”并且第一个参数是自我语法被保留),而{ {1}}和-

阅读文档以获取完整说明。