【问题标题】:Can I use Exporter in Perl to export a Struct?我可以在 Perl 中使用 Exporter 来导出 Struct 吗?
【发布时间】:2014-08-21 01:14:11
【问题描述】:

我在一个模块中定义了一个结构(使用 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,或者即使我应该。你能帮忙吗?

【问题讨论】:

    标签: perl struct exporter


    【解决方案1】:

    Exporter 在这里不合适。你自己说的:你可以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 类。来自perlobj:一个类只是一个包。一个类提供了期望对对象进行操作的方法。

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

    MyPackage.pm:

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

    MyStruct.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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-07
      • 2011-05-08
      • 1970-01-01
      相关资源
      最近更新 更多