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

Zai*_*aid 14 perl object decrement

Date::Simple对象显示此行为,$date++返回第二天的日期.

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

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

我已经浏览了perlboot,perltoot,perltoocperlbot,但我没有看到任何显示如何做到这一点的例子.

dar*_*rch 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
Run Code Online (Sandbox Code Playgroud)


Chr*_*utz 7

如果你查看perlfaq7,你会发现答案是使用重载编译指示,尽管他们可能已经给了FAQ问题一个更好的名字(在我看来).

package SomeThing;

use overload
  '+' => \&myadd,
  '-' => \&mysub;
Run Code Online (Sandbox Code Playgroud)

基本上(假设$aSomeThing类的一个对象而$b不是),上面会重载$a + $b为be $a->myadd($b, 0)$b + $ato $a->myadd($b, 1)(也就是说,第三个参数是一个布尔意思是"这个运算符的参数被翻转"而第一个参数是-self语法保留),与同为-mysub.

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

  • 嗯,这是FAQ的糟糕标题.这也是一个非常糟糕的答案.我会将它添加到我要修复的事项列表中. (2认同)