2

我在模块中定义了一个结构(使用 Class:Struct),我对它如何导出到另一个模块感到困惑。

package MyPackage;
use Class::Struct;
use Exporter 'import';
@EXPORT = qw( function1 function2 );
struct(MyStruct=>{'type'=>'$', 'other'=>'$'});

现在,如果我将 MyPackage 包含在不同的模块中,我可以直接创建一个 MyStruct 变量:

package OtherPackage;
use MyPackage qw(function1 function2);
use Data::Dumper;

sub my_function {
    print Dumper(MyStruct);
}

如果我调用 my_function,它会按预期打印出空结构。

但是,这是我的困惑,我不知道如何将它添加到@EXPORT,或者即使我应该。你能帮忙吗?

4

1 回答 1

2

出口商在这里不合适。你自己说过:你可以use MyPackage;初始化MyStructs。您给出的示例,如果在没有 Class::Struct 便利的情况下编写,将如下所示:

package MyPackage;
use Exporter qw(import);
our @EXPORT = qw(function1 function2);
sub function1 { ... }
sub function2 { ... }
1;

package MyStruct;
sub new # Constructor
{ 
    my $self = shift; 
    my %args = @_;
    return bless(
        {
            'MyStruct::type'  => $args{type},
            'MyStruct::other' => $args{other},
        },
        $self,
    );
}

sub type # Setter/getter for type
{
    my ($self, $set) = shift;
    return $set ? $self->{type} = $set
                : $self->{type};
}

sub other # Setter/getter for other
{
    ... # So on and so forth
}
1;

不同之处在于 Class::Struct 采用“蓝图”并MyStruct为您编写类。From perlobj:一个类只是一个包。一个类提供了期望对对象进行操作的方法。

将两个包放在一个文件中(这是 Class::Struct 隐式执行的操作)非常令人困惑,因此您可以将它们分开。

我的包.pm:

package MyPackage;
use parent qw(Exporter);
our @EXPORT_OK = qw(function1 function2);
sub function1 { ... }
sub function2 { ... }
1;

我的结构.pm:

package MyStruct;
use Class::Struct;
struct( 
    MyStruct => { 
        'type' => '$',
        'other' => '$'
    }
);
1;

您的问题尚不清楚,但如果MyPackage::function1()要对 MyStruct 对象中包含的数据进行操作,您应该MyPackage完全废弃并将其作为 MyStruct 中的方法提供:

package MyStruct;
use Class::Struct;
struct( 
    MyStruct => { 
        'type' => '$',
        'other' => '$'
    }
);
sub function1
{
    my $self = shift;
    print "This is function1 in $self\n";
}
1;

最后,不要从 MyStruct 中导出任何内容,而是像对象一样使用它:

use MyStruct;
my $instance = MyStruct->new( type => 'foo' ); # Instantiating
$instance->other('bar'); # Setting
print $instance->type;   # Getting
于 2014-08-21T03:48:40.190 回答