- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
如何从 Moose 包中导出正常的非 OO 子例程?在常规包中,我会使用 Exporter
、@ISA
和 @EXPORT
来完成此操作。
最佳答案
Moose 用于构建类和角色。虽然从技术上讲您也可以导出函数,但这不一定是最好的主意。
这是一个示例 Moose 类,它还导出一个函数。
MyApp/Widget.pm
use v5.26;
use warnings;
package MyApp::Widget;
use Exporter qw( import );
our @EXPORT_OK = qw( is_widget );
use Moose;
use namespace::autoclean -except => 'import';
has name => ( is => 'ro', isa => 'Str', required => 1 );
sub is_widget {
my $object = shift;
blessed( $object ) and $object->isa( __PACKAGE__ );
}
__PACKAGE__->meta->make_immutable;
以下是您可以如何使用它:
use v5.26;
use warnings;
use MyApp::Widget qw( is_widget );
my $w = 'MyApp::Widget'->new( name => 'Foo' );
say is_widget( $w );
say $w->is_widget;
请注意,尽管 is_widget
是一个可导出函数,但它也可以作为方法调用!在这种情况下,这是一个功能而不是一个错误,但通常这会带来不便。
更好的想法可能是创建两个单独的包:一个用于您的类,另一个用于您的可导出函数。
MyApp/Widget.pm
use v5.26;
use warnings;
package MyApp::Widget;
use Moose;
use namespace::autoclean;
has name => ( is => 'ro', isa => 'Str', required => 1 );
__PACKAGE__->meta->make_immutable;
MyApp/Util.pm
use v5.26;
use warnings;
package MyApp::Util;
use Exporter qw( import );
our @EXPORT_OK = qw( is_widget );
use Scalar::Util qw( blessed );
sub is_widget {
my $object = shift;
blessed( $object ) and $object->isa( 'MyApp::Widget' );
}
1;
你可以这样调用你的包:
use v5.26;
use warnings;
use MyApp::Widget;
use MyApp::Util qw( is_widget );
my $w = 'MyApp::Widget'->new( name => 'Foo' );
say is_widget( $w );
由于 Moose 类和 Exporter 现在完全分离,因此您无法再调用 $w->is_widget
— 它完全是一个函数,不再是一个方法。
关于perl - 如何从 Moose 包中导出子例程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71538813/
我正在将旧应用程序转换为使用 Moose(和 Catalyst)并有以下问题。 如何确定用户输入的数据的 Moose 类型? 在下面的粗略示例中,我“提交”多个查询并使用下面非常基本的“验证”方法针对
从另一个 Moose 对象创建实例的正确方法是什么?在实践中,我已经看到这是通过多种方式完成的: $obj->meta->name->new() $obj->new() ## which has b
假设您有一个 Moose 类,它需要一个执行角色的属性: package MyMooseClass; use Moose; has 'a' => ( does => 'MyRole' ); 现在,我想
Moose types很棒,但有时您需要更具体。这些数据类型规则你们都知道:那个参数只能是'A' , 'B'或 'C' ,或者只是一个货币符号,或者必须符合一些正则表达式。 看看下面的例子,它有两个受
试图构建一种优雅的方式来序列化带有嵌套 Moose 对象的 Moose 对象。例子: package Asset; use Moose::Role; has 'value' => ( isa =>
我正在寻找一种在父级中设置一些辅助方法的方法 Moose类,而不是独立的实用程序类。如果可能的话,这将是一种将 Moose 糖添加到模块的更透明的方式,因为它不需要明确要求任何辅助模块(因为一切都将通
令我沮丧的是,我注意到 MooseX::Method不再维护和弃用。 包裹MooseX-Method-Signatures被宣传为替代品,但其文档说:这是 ALPHA SOFTWARE。使用风险自负。
我正在尝试创建一个对象,该对象将从网络中获取资源,并且需要记住最终找到资源的位置以及我们为其提供的原始 URL。 我不想必须两次指定 URL,也不想每次我想使用 URL 来确定我应该使用“url”属性
我有一个角色声明它需要一个方法(使用requires)。我试图通过直接在类的符号表中定义来安装该方法。但是,在某些情况下它有效,而在其他情况下则无效。 在下文中,WORKS 表示未报告任何错误,DOE
基本架构 我用 perl 构建了一个信息检索工具,使用 Moose 作为框架。 我有一个用于插件的类层次结构,其中 Base 作为插件的公共(public)基类,特定插件的访问方法从中继承(方法是 H
如何设置 Moose 只读属性特征? package AttrTrait; use Moose::Role; has 'ext' => ( isa => 'Str', is => 'ro' ); pa
我开始使用 Moose,我有以下问题。似乎我可以分配我没有在模块中指定的属性。如果我尝试访问此属性,则会出现错误消息。我怎样才能阻止模块中未指定的属性的分配?在下面的示例中,我指定了年龄,但我没有在模
package Point; use Moose; has 'x' => (isa => 'Int', is => 'rw'); has 'y' => (isa => 'Int', is => 'rw
我想要实现的是创建一个导入多个角色的 Moose 类。这是我多年来一直在做的事情,没有任何问题,尽管我目前坚持为什么下面的简单示例会产生方法名称冲突。 package logrole; use Moo
我试图找出一种方法来查看我的一个懒惰构建的属性是否已设置。我已经搜索了两个文档 驼鹿::元::属性和 类::MOP::属性 ,并看到了 get_value和 has_value方法,但它们似乎对我不起
使用 Moose 时自定义初始化某些属性的典型方法是什么? 例如,假设我将两个字符串格式的日期作为我的类的输入: has startdate => (is => 'ro', isa => 'Str'
我写了一个简单的Moose基于类称为 Document .这个类有两个属性:name和 homepage . 该类还需要提供一个名为 do_something() 的方法。它根据 homepage 从
我正在尝试使用 Perl 和 Moose 编写单例角色。我知道 MooseX::Singleton 模块可用,但是当我们的项目需要另一个 CPAN 模块时总是会遇到阻力。在尝试了这个并遇到了一些麻烦之
再次遇到 Moose 对象模型的问题。我不确定是在这里发帖还是发到“codereview”更好 - 先在这里尝试...;) 有一个Region。 该地区有一些 Spot(s)。 每个 Spot 都有
我编写了一组在 Moose 中实现的类和接口(interface)。也使用角色。我难以理解的是 Moose 特征与角色在使用和实现方面的确切差异。 Moose documentation状态: It
我是一名优秀的程序员,十分优秀!