【问题标题】:Do all my Moose classes have to contain 'namespace::autoclean' and 'make_immutable' or is there some way to get these by default?我所有的 Moose 类都必须包含 'namespace::autoclean' 和 'make_immutable' 还是有什么方法可以默认获得这些?
【发布时间】:2010-10-23 01:34:44
【问题描述】:

根据 Moose 最佳实践文档,我的 Moose 课程应如下所示:

package Person;

use Moose;
use namespace::autoclean;

# extends, roles, attributes, etc.

# methods

__PACKAGE__->meta->make_immutable;

1;

Moose::Manual::BestPractices

而且 99% 的时间这都是我想要的,所以有没有办法让我的命名空间自动清理,并且我的类默认不可变,这样我就不必让这些代码混乱?

也许有技术原因导致它不可能或为什么不应该这样做?

谢谢

【问题讨论】:

    标签: perl moose


    【解决方案1】:

    我认为唯一的避免这种情况的一种方法是使用MooseX::Declare

    MooseX::Declare 是一个macro,下面变成您的示例:

    use MooseX::Declare;
    
    class Person {
    
        # attributes
    
        # methods
    }
    

    它会自动插入namespace::autoclean 并使类不可变。

    为了扩展你做的类:

    class Person extends Human { ... }
    

    对于添加角色,您需要:

    class Person with BlueEyeRole { ... }
    

    您可以轻松地组合这些:

    class Person extends Human with BlueEyeRole { ... }
    

    您还可以获得一些其他已定义的关键字,例如。 method:

    class Person {
        has 'name' => (is => 'rw', isa => 'Str');
    
        method hello { "Hello " . $self->name }
    }
    

    如果你确实想让你的类可变,那么它:

    class Person is mutable { ... }
    

    也许有技术原因导致它不可能或为什么不应该这样做?

    从技术上讲,很难将这一切整合在一起。 MooseX::Declare 使用 Devel::Declare 构建必要的语法供 Perl 解释。

    因此,如果样板对您来说是个问题,那么请考虑使用MooseX::Declare。我已经在很多项目中使用它,没有任何问题,并且在快速绘制基于类的应用程序时发现它是理想的。但大多数时候我对样板文件感到满意,因此坚持使用标准 Moose

    【讨论】:

    • 因为错了。 MX::D 绝不是实现这一目标的唯一方法。
    • @rafl:我说这是我知道的唯一方法。所以我认为这不值得投反对票:(
    • 固定序言。对读者来说重要的是它是否真的是唯一的方式,而不是它是否是 draegtun 知道的唯一方式。 :)
    • 感谢@Ether。我打算做出类似的改变,但被我 4 岁的孩子叫走了:)
    • @rafl:没关系。顺便说一句,减少此样板的其他方法是什么?
    【解决方案2】:

    我认为MooseX::MakeImmutable可以为你做到。

    【讨论】:

    • 谢谢jira,我试试看。
    猜你喜欢
    • 2013-12-16
    • 1970-01-01
    • 2013-08-21
    • 2013-07-18
    • 2011-07-29
    • 1970-01-01
    • 2013-06-04
    • 2018-12-14
    • 2017-10-01
    相关资源
    最近更新 更多