以下代码无法按预期工作。我错过了什么?
use strict;
use warnings;
use overload '|' => sub { 1 / ( 1 / $_[0] + 1 / $_[1] ) };
print( 5 | 5 ); # Prints '5' instead of '2.5'
答案 0 :(得分:9)
overload
仅适用于受祝福的引用(“对象”)。
package MyNumber;
use strict;
use warnings;
use overload '|' => sub { 1 / ( 1 / +$_[0] + 1 / +$_[1] ) },
'0+' => sub { $_[0]->{value} }, # Cast to number
fallback => 1; # Allow fallback conversions
# "Constructor", bless number as MyNumber
sub num {
my $self = { value => $_[0] }; # can be any reference
return bless $self, "MyNumber";
}
print(num(5) | num(5));
my $a = num(5);
print ($a | 5); # This works too
答案 1 :(得分:5)
重载适用于对象,如下所示:
use v5.10;
package Number {
use overload
'|' => sub { 1 / ( 1 / ${$_[0]} + 1 / ${$_[1]} ) },
fallback => 1
;
sub new {
my( $class, $arg ) = @_;
bless \ $arg, $class;
}
}
my $n = Number->new( 5 );
my $m = Number->new( 5 );
say( $n | $m );
但是,有许多事情需要注意,因为Perl 5不进行多方法调度。在你的子程序中,你必须弄清楚第二个参数,所以你自己就是正确的。这可能会变得复杂。我更倾向于使用常规方法。
答案 2 :(得分:4)
[问题已经回答了。这是一条不适合评论框的评论。]
可以使用自动装箱完成:
use strict;
use warnings;
use overload '|' => sub { 1 / ( 1 / ${$_[0]} + 1 / ${$_[1]} ) };
BEGIN { overload::constant integer => sub { my ($n) = @_; bless(\$n) }; }
print( 5 | 5, "\n" ); # 2.5