代码之家  ›  专栏  ›  技术社区  ›  Zaid

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

  •  14
  • Zaid  · 技术社区  · 15 年前

    Date::Simple 对象显示此行为,其中 $date++

    简单对象是不可变的。将$date1分配给$date2后,对$date1的任何更改都不会影响$date2。这意味着,例如,没有什么能像一个固定的年操作,和 $date++为$date分配一个新对象 .

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

    perlboot , perltoot perltooc perlbot ,但我没有看到任何例子表明如何做到这一点。

    2 回复  |  直到 15 年前
        1
  •  12
  •   darch    15 年前

    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
    
        2
  •  7
  •   Chris Lutz    15 年前

    如果你抬头看 perlfaq7 你会发现答案是使用 overload

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

    基本上(假设 $a SomeThing 类和 $b 是不是),上面的会超负荷 $a + $b 成为 $a->myadd($b, 0) $b + $a $a->myadd($b, 1) (也就是说,第三个参数是一个布尔值,意思是“这个运算符的参数是否翻转了”,第一个参数是自语法保留),对于 - mysub .