14

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

Date::Simple 对象是不可变的。将 $date1 分配给 $date2 后,对 $date1 的任何更改都不会影响 $date2。这意味着,例如,没有什么类似于 set_year 操作,并且$date++ 将一个新对象分配给 $date

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

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

4

2 回答 2

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
于 2010-05-03T06:44:18.853 回答
7

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

package SomeThing;

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

基本上(假设$aSomeThing类的一个对象,而$b不是),上面会重载$a + $bto$a->myadd($b, 0)$b + $ato $a->myadd($b, 1)(也就是说,第三个参数是一个布尔值,意思是“这个运算符的参数是否翻转”,第一个参数是-self 语法被保留),对于-and 也是如此mysub

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

于 2010-05-03T06:32:35.260 回答