只是爲了理智檢查超載似乎沒有爲我工作。我不知道它是我擁有的perl版本還是overload.pm的版本,或者是我已經實現它的錯誤,但是這段代碼不適用於我。爲什麼「use overload」與「use namespace:autoclean」一起工作?
perl的版本
This is perl, v5.10.1 (*) built for x86_64-linux-gnu-thread-multi
過載版本
perl -Moverload -e 'print "$overload::VERSION\n";'
1.07
Token.pm
package Token;
use namespace::autoclean;
use Data::Dumper;
use Moose;
use Moose::Util::TypeConstraints;
use overload '+' => \&_overload_add, fallback => 1;
has 'secretvalue' => (is => 'rw', isa => 'Int');
sub _overload_add{
my ($one, $two) = @_;
my $value = $one->secretvalue() + $two->secretvalue();
return ($value);
}
主
use strict;
use warnings;
use Token;
my $t = Token->new(secretvalue => 17, key => 'x');
my $t2 = Token->new(secretvalue => 12, key => 'y');
my $x = $t + $t2;
print $x;
個打印
$VAR1 = 12900840;
最糟糕的是,我沒有得到任何形式的日誌中的警告或錯誤的。
UPDATE
感謝Freido尋找問題。我已經更新了這個問題,以防其他人絆倒在這。
Perl/Moose社區通常不使用超載嗎?
+1找到解決方案後,我在桌子上敲了我的頭一兩個小時試圖找到我的代碼問題。愚蠢的圖書館錯誤! – qodeninja
在那裏,做到了。 :)我對你的問題感到非常困惑,直到我記得'overload'通過插入魔法符號工作,我想知道'autoclean'是否搞亂了它們。 – friedo
@nodebunny,當你可以自己寫自己的時候,爲什麼會抱怨別人的代碼? :)這個問題啓發了我寫[namespace :: sweep](http://search.cpan.org/~friedo/namespace-sweep/lib/namespace/sweep.pm),它不會踐踏你的重載。更多信息[這裏](http://blogs.perl.org/users/mike_friedman/2011/10/announcing-namespacesweep.html)。 – friedo