Perl 我所有的Moose类都必须包含';名称空间::自动清理';和';使#u不可变';或者有什么方法可以在默认情况下获取这些信息?
根据Moose最佳实践文档,我的Moose课程应该如下所示:Perl 我所有的Moose类都必须包含';名称空间::自动清理';和';使#u不可变';或者有什么方法可以在默认情况下获取这些信息?,perl,moose,Perl,Moose,根据Moose最佳实践文档,我的Moose课程应该如下所示: package Person; use Moose; use namespace::autoclean; # extends, roles, attributes, etc. # methods __PACKAGE__->meta->make_immutable; 1; 看 99%的时候这就是我想要的,那么有没有办法让我的命名空间自动清理,让我的类在默认情况下保持不变,这样我就不必让代码变得混乱 也许有一个技术
package Person;
use Moose;
use namespace::autoclean;
# extends, roles, attributes, etc.
# methods
__PACKAGE__->meta->make_immutable;
1;
看
99%的时候这就是我想要的,那么有没有办法让我的命名空间自动清理,让我的类在默认情况下保持不变,这样我就不必让代码变得混乱
也许有一个技术上的原因,为什么它不可能或为什么它不应该这样做
谢谢我认为避免这种情况的唯一方法是使用
是一个宏
,它将下面变成您的示例:
use MooseX::Declare;
class Person {
# attributes
# methods
}
它自动插入namespace::autoclean
,并使类不可变
要扩展类,请执行以下操作:
class Person extends Human { ... }
class Person with BlueEyeRole { ... }
对于添加角色,您可以执行以下操作:
class Person extends Human { ... }
class Person with BlueEyeRole { ... }
您可以轻松地组合这些:
class Person extends Human with BlueEyeRole { ... }
您还可以获得一些其他定义的关键字,例如方法
:
class Person {
has 'name' => (is => 'rw', isa => 'Str');
method hello { "Hello " . $self->name }
}
如果确实希望使类可变,则其:
class Person is mutable { ... }
也许有一个技术上的原因,为什么它不可能或为什么它不应该这样做 从技术上讲,要把这一切结合起来是很困难的。使用来构建Perl解释所需的语法
因此,如果锅炉板是一个问题,那么就考虑使用。我已经在很多项目中使用过它,没有任何问题,并且在快速绘制基于类的应用程序时发现它非常理想。然而,大多数时候我对样板文件很满意,所以坚持使用标准的
Moose
我认为它可以为您做到。因为它是错误的。MX::D绝不是实现这一目标的唯一途径。@rafl:我说过这是我知道的唯一途径。所以我认为这不值得投反对票:(固定序言。对读者来说,重要的是它是否真的是唯一的方式,而不是它是否是德雷顿知道的唯一方式。:)谢谢@Ether。我本来打算做类似的改变,但被我4岁的孩子叫走了:)@rafl:没关系。顺便说一句,还有什么其他方法可以减少这个样板?谢谢jira,我会尝试一下。