【问题标题】:How can I define pre/post-increment behavior in Perl objects?如何在 Perl 对象中定义前/后增量行为?
【发布时间】:2011-02-14 22:16:43
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我查过了,显然这不是骗人的。 +1 可能早就应该在这里提出的问题。

标签: perl object decrement


【解决方案1】:

如果您查看perlfaq7,您会发现答案是使用overload pragma,尽管他们可能会为FAQ 问题起一个更好的名称(在我看来)。

package SomeThing;

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

基本上(假设$aSomeThing 类的对象,而$b 不是),上面将重载$a + $b 成为$a->myadd($b, 0)$b + $a$a->myadd($b, 1)(即,第三个参数是一个布尔值,意思是“这个运算符的参数是否被翻转”并且保留了 first-argument-is-self 语法),-mysub 也是如此。

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

【讨论】:

  • 嗯,这是一个糟糕的常见问题解答标题。这也是一个相当糟糕的答案。我会将其添加到我的待修复事项列表中。
【解决方案2】:

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

【讨论】:

  • 感谢您的编辑,cjm;现在我知道了链接到文档的约定。 :)
  • +1 很好的例子。您可能希望使 ++ 的行为非标准,以便其他人可以看到/感受到不同
猜你喜欢
  • 2022-01-13
  • 2011-09-18
  • 2012-09-15
  • 2014-06-15
  • 2013-02-21
  • 2012-06-01
  • 2021-07-31
  • 1970-01-01
相关资源
最近更新 更多