gpt4 book ai didi

perl - 如何从 Moose 包中导出子例程?

转载 作者:行者123 更新时间:2023-12-02 01:41:31 26 4
gpt4 key购买 nike

如何从 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/

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