加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – MooseX :: NonMoose类中mixins的问题

发布时间:2020-12-16 06:24:47 所属栏目:大数据 来源:网络整理
导读:考虑以下: package MyApp::CGI;use Moose;use MooseX::NonMoose;use Data::Dumper;extends 'CGI::Application';BEGIN { print "begin isa = " . Dumper @MyApp::CGI::ISA;};print "runtime isa = " . Dumper @MyApp::CGI::ISA;... 编译时的输出是: begin
考虑以下:

package MyApp::CGI;

use Moose;
use MooseX::NonMoose;
use Data::Dumper;

extends 'CGI::Application';

BEGIN { 
    print "begin isa = " . Dumper @MyApp::CGI::ISA;
};

print "runtime isa = " . Dumper @MyApp::CGI::ISA;

...

编译时的输出是:

begin isa = $VAR1 = [
          'Moose::Object'
        ];
runtime isa = $VAR1 = [
          'CGI::Application','Moose::Object'
        ];

我为什么在意?因为当我尝试使用CGI :: Application :: Plugin :: *类时,它希望我在编译时继承CGI :: Application.插件类试图在我的类上调用add_callback作为类方法,但不能,因为我的@ISA尚未设置.

解决这个问题的最佳方法是什么?在BEGIN块中手动调整@ISA会干扰MooseX :: NonMoose吗?

编辑

以下似乎有效,但我发现它令人反感:

package MyApp::CGI;

use Moose;
use MooseX::NonMoose;

use base 'CGI::Application';
extends 'CGI::Application';

关于Moose内部人员我不知道(或任何事情,真的)知道这是不是一个好主意.

解决方法

我找不到使用base’CGI :: Application’;扩展’CGI :: Application’;非常可怕,因为它完全符合你的需要:

>在编译时,@ISA包含’CGI :: Application’,它完全满足CGI :: Application :: Plugin :: *的使用要求
>在运行时,你的班级是CGI::Application的Moose后代,具有所有后续的好处(能够用Moosey元善良设计你班级的作文).只有在遇到扩展’CGI :: Application’行之后才会完成任何工作(即在你的类上调用方法),这些工作依赖于extends语句所做的工作:你的类来自Moose :: Object而你安装了一个元类.

也就是说,jrockway的解决方案也应该有效:

BEGIN { extends 'CGI::Application' }

…在你需要的时候,你可以提前获得所有Moosey meta goodness,并且它不应该超出预定时间,前提是你已经调用了Moose并使用MooseX :: NonMoose来定义延伸.

(附录:现在我正在思考创建强制在编译时强制解析关键字的能力的复杂性,这些解析是立即解析的,例如它们是否包含在BEGIN块中.例如,如果Moose.pm声明使用了compiletime qw(extends).肯定会是一段很好的语法糖.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读