gpt4 book ai didi

perl - MooseX::NonMoose 类中的混合问题

转载 作者:行者123 更新时间:2023-12-04 19:23:38 26 4
gpt4 key购买 nike

考虑以下:

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'
];

我为什么在乎?因为当我尝试 use一个 CGI::Application::Plugin::* 类,它希望我从 CGI::Application 继承在编译时已经。插件类尝试调用 add_callback作为我类(class)的类方法,但不能,因为我的 @ISA尚未设置。

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

编辑

以下似乎有效,但我觉得它令人反感:
package MyApp::CGI;

use Moose;
use MooseX::NonMoose;

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

我对 Moose 的内部结构知之甚少(或任何事情,真的),不知道这是否是一个好主意。

最佳答案

我没有找到 use base 'CGI::Application'; extends 'CGI::Application';非常可怕,因为它正是您所需要的:

  • 在编译时,@ISA包含 'CGI::Application' ,正好满足CGI::Application::Plugin::*
  • 的使用需求
  • 在运行时,您的类是 Moose CGI::Application的后代,以及所有随之而来的好处(能够使用 Moosey meta goodness 设计您的类的组合)。只有在 extends 'CGI::Application' 之后遇到任何依赖于 extends 完成的工作的工作(即在您的类上调用方法)。声明:你的类(class)来自 Moose::Object你已经安装了一个元类。

  • 也就是说,jrockway 的解决方案也应该有效:
    BEGIN { extends 'CGI::Application' }

    ...在你需要的时候,你可以提前一点点获得 Moosey 元的优点,而且它不应该太提前,前提是你已经调用 use Mooseuse MooseX::NonMoose为了定义 extends .

    (附录:现在我正在考虑创建在编译时强制解析关键字的能力的复杂性,这些关键字会立即被解析,例如如果它们被包裹在 BEGIN 块中。例如像 if Moose.pm声明 use compiletime qw(extends) 。这肯定是一个不错的语法糖。)

    关于perl - MooseX::NonMoose 类中的混合问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1656274/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com