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

发布于 2024-08-30 22:57:50 字数 829 浏览 9 评论 0原文

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

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

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

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

Date::Simple objects display this behavior, where $date++ returns the next day's date.

Date::Simple objects are immutable. After assigning $date1 to $date2, no change to $date1 can affect $date2. This means, for example, that there is nothing like a set_year operation, and $date++ assigns a new object to $date.

How can one custom-define the pre/post-incremental behavior of an object, such that ++$object or $object-- performs a particular action?

I've skimmed over perlboot, perltoot, perltooc and perlbot, but I don't see any examples showing how this can be done.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

沦落红尘 2024-09-06 22:57:50

您需要重载

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

You want 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
全部不再 2024-09-06 22:57:50

如果您查找 perlfaq7 你会发现答案是使用重载< /a> pragma,尽管他们可能可以给常见问题解答问题一个更好的名称(在我看来)。

package SomeThing;

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

基本上(假设 $aSomeThing 类的对象,而 $b 不是),上面的代码会重载 $a + $b$a->myadd($b, 0)$b + $a$a->myadd($b, 0) myadd($b, 1) (也就是说,第三个参数是一个布尔值,表示“该运算符的参数是否翻转”并且保留第一个参数是 self 语法),对于 < 也是如此代码>-和<代码>mysub。

阅读文档以获得完整的解释。

If you look up perlfaq7 you'll find that the answer is to use the overload pragma, though they probably could have given the FAQ question a better name (in my opinion).

package SomeThing;

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

Basically (assuming $a is an object of the SomeThing class and $b isn't), the above would overload $a + $b to be $a->myadd($b, 0) and $b + $a to $a->myadd($b, 1) (that is, the third argument is a boolean meaning "were the arguments to this operator flipped" and the first-argument-is-self syntax is preserved), and the same for - and mysub.

Read the documentation for the full explanation.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文