【问题标题】:Moose: Extending Exporter causes constructor to disappear?Moose:扩展 Exporter 会导致构造函数消失?
【发布时间】:2009-11-27 04:39:51
【问题描述】:

这里有一些奇怪的东西,我想不通。我有一个 Moose 类,我还想使用古老的标准 Exporter 模块导出一些常量。但是,一旦我将extends Exporter 添加到我的类中,由于某种原因,默认的 Moose 构造函数不再被继承,我得到了致命错误:

Can't locate object method "new" via package "MyApp::Dispatch"

这是一个演示问题的简单测试。

package Foo;
use Moose;
use constant NARF => 'poit';
extends 'Exporter';

1;

$ perl -I./lib -MFoo -e '$f=Foo->new'
Can't locate object method "new" via package "Foo" at -e line 1.

删除extends 行会使问题消失。

这是使用 Moose 0.93。

【问题讨论】:

    标签: perl moose exporter


    【解决方案1】:

    假设您从另一个基于 Moose 的类继承,所以它不会从 Moose::Object 继承。我不确定标准答案是什么:只需手动添加 Moose::Object 或以某种方式使用 MooseX::NonMoose 或其他东西。

    但是即使没有继承,Exporter 也能正常工作;只需导入其导入例程:

    use Exporter "import";
    

    【讨论】:

    • 嗯,这应该很明显,不是吗?今晚我感觉很笨。 :) 我以前什至使用过 MooseX::NonMoose,所以我应该想到这一点,但没有。无论如何,导入 import 而不是继承工作正常。
    • Moose 的extends 相当于@ISA = @list。如果此列表在编译时为空,Moose 会自动为您将Moose::Object 放入@ISA。
    • @perigrin:这基本上就是我所说的。
    【解决方案2】:

    你已经得到了真正的答案,但真正的问题是为什么你有一个导出东西的模块并且是一个对象?这是一个非常奇怪的设计,可能是代码味道。

    【讨论】:

    • 导出是常量,被系统其他部分注册的回调使用;我同意这有点奇怪,可能迟早会重新考虑设计。但它现在有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-26
    • 1970-01-01
    相关资源
    最近更新 更多