perl – 为什么“use overload”与“use namespace:autoclean”
发布时间:2020-12-15 21:12:01 所属栏目:大数据 来源:网络整理
导读:好吧,只是为了健康检查超载似乎没有为我工作.我不知道是否是perl的版本,或者是overload.pm的版本,或者我实现它的方式有问题,但是这个代码对我来说不行. perl版本 This is perl,v5.10.1 (*) built for x86_64-linux-gnu-thread-multi 过载版本 perl -Moverloa
好吧,只是为了健康检查超载似乎没有为我工作.我不知道是否是perl的版本,或者是overload.pm的版本,或者我实现它的方式有问题,但是这个代码对我来说不行.
perl版本 This is perl,v5.10.1 (*) built for x86_64-linux-gnu-thread-multi 过载版本 perl -Moverload -e 'print "$overload::VERSIONn";' 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社区一般不会使用超载吗? 解决方法
命名空间:: autoclean是与过份加法来处理您的运算符的魔力.以下工作原理如您所料:
package Token; use Moose; use Moose::Util::TypeConstraints; use overload '+' => '_overload_add'; has 'secretvalue' => ( is => 'rw',isa => 'Int'); sub _overload_add{ my ( $one,$two ) = @_; my $value = $one->secretvalue() + $two->secretvalue(); return ($value); } 1; 偶然的一瞥在命名空间中没有显示任何东西:: autoclean docs解决这个问题,所以我想这是一个意想不到的功能.有些搜索显示有一个bug已被报道. 我想这是减少重载添加到你的包的特殊符号.重载会添加符号表条目(),(和OVERLOAD.我猜想这些条目中的一些或全部都是由namespace :: autoclean进行抽真空的,因此可以撤销你的重载. 如果你觉得冒险,here’s a patch为namespace :: autoclean过滤掉过载符号. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |