Zai*_*aid 14 perl object decrement
Date::Simple
对象显示此行为,$date++
返回第二天的日期.
Date ::简单对象是不可变的.将$ date1分配给$ date2后,$ date1的更改不会影响$ date2.这意味着,例如,没有像set_year操作,$ date ++将新对象分配给$ date.
如何自定义对象的前/后增量行为,以便执行++$object
或$object--
执行特定操作?
我已经浏览了perlboot,perltoot,perltooc和perlbot,但我没有看到任何显示如何做到这一点的例子.
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)
如果你查看perlfaq7,你会发现答案是使用重载编译指示,尽管他们可能已经给了FAQ问题一个更好的名字(在我看来).
package SomeThing;
use overload
'+' => \&myadd,
'-' => \&mysub;
Run Code Online (Sandbox Code Playgroud)
基本上(假设$a
是SomeThing
类的一个对象而$b
不是),上面会重载$a + $b
为be $a->myadd($b, 0)
和$b + $a
to $a->myadd($b, 1)
(也就是说,第三个参数是一个布尔意思是"这个运算符的参数被翻转"而第一个参数是-self语法保留),与同为-
和mysub
.
阅读文档以获取完整说明.